假设我有两个类a
和b
,其中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
我是不是只复制这个实例,做一个指向它的指针,然后像上面那样传递到一个函数中? 或者有没有更干净的方法来做到这一点?
这里的最佳实践是利用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中的字段。
如果要防止修改,可以:
g
这两个方法都创建原始对象的副本并传递该(切片)副本
您还可以使用常量引用:
void g(const A& myObject);
这将传递对原始对象的引用,但如果您试图修改它,编译器将引发错误。