提问者:小点点

在C++中,有没有一种方法通过值将纯抽象类的所有子类传递给一个函数?


假设我有两个类ab,其中a是一个具有纯虚函数的纯抽象类,而b继承自a并实现纯虚函数。 如果我有一个函数g(),我想通过值传递a的子类的任何实例(这样我就可以在不改变原始实例的情况下改变它),你会怎么做呢? 我知道以下代码不符合我的目的:

void g(A myObject) {} //doesn't work since A contains a pure virtual function

void g(A* myObject) {} //code compiles, but changes the original instance 

我是不是只复制这个实例,做一个指向它的指针,然后像上面那样传递到一个函数中? 或者有没有更干净的方法来做到这一点?


共2个答案

匿名用户

这里的最佳实践是利用clone()方法:

class Base
{
public:
    virtual int foo(int d) = 0;
    virtual std::unique_ptr<Base> clone() = 0;
};

class Derived: Base
{
public:
    std::unique_ptr<Base> clone() override { return std::make_unique<Derived>(*this); }
};

匿名用户

如果A中的纯虚函数可以被复制,那么您应该将原始对象切片,只保留A中的字段。

如果要防止修改,可以:

  • 用引发异常的函数替换纯虚函数。 类A将变得可创建,但如果您试图在非子类对象上使用该函数,它仍然会中断。
  • 在具有上述定义函数的层次结构中插入A1类,并在g
  • 中使用它

这两个方法都创建原始对象的副本并传递该(切片)副本

您还可以使用常量引用:

void g(const A& myObject);

这将传递对原始对象的引用,但如果您试图修改它,编译器将引发错误。

相关问题


MySQL Query : SELECT * FROM v9_ask_question WHERE 1=1 AND question regexp '(c++|中|一种|方法|值|抽象类|子类|递给|函数)' ORDER BY qid DESC LIMIT 20
MySQL Error : Got error 'repetition-operator operand invalid' from regexp
MySQL Errno : 1139
Message : Got error 'repetition-operator operand invalid' from regexp
Need Help?