我想执行以下等效操作来初始化数据成员 my_abc
(我怀疑这不会起作用):
class ABC { // abstract base class
public:
virtual ~ABC {};
}
class SomeClass {
public:
SomeClass(ABC& abc); // argument will actually be instance of derived class
private:
ABC my_abc; // needs to be set from constructor argument
}
SomeClass::SomeClass(ABC& abc) : my_abc(abc)
{...} // copy construct `my_abc` from argument
我怀疑当 ABC
的派生类传递给 SomeClass
构造函数时,这不会起作用,因为不会调用派生类的复制构造函数初始化 my_abc
成员。
我说的对吗?如果是这样,我该怎么办?
最佳答案
你说,
SomeClass(ABC& abc); // argument will actually be instance of derived class
然后,你有一个成员(member)数据
ABC my_abc;
如果您使用abc
初始化my_abc
,您将得到一个不捕获派生类部分的基类对象。查看 object slicing 的问题.这是你希望完成的吗?我认为不是。
正如 πìντα ῥεῖ 在评论中提到的,您应该存储对基类的引用。
ABC& my_abc_ref;
然后,
SomeClass::SomeClass(ABC& abc) : my_abc_ref(abc) {...}
应该不是问题。
如果你想拥有输入对象的拷贝,你需要克隆输入对象并保持被克隆对象的生命周期。您可以使用智能指针来实现这一点。
class ABC {
public:
virtual ~ABC() {}
virtual ABC* clone() const = 0;
};
#include <memory>
class SomeClass {
public:
SomeClass(ABC& abc);
private:
std::unique_ptr<ABC> my_abc;
};
SomeClass::SomeClass(ABC& abc) : my_abc(abc.clone()) {}
这只是展示了机制。要创建生产质量代码,您必须对复制和移动构造函数的行为做出策略决策,并复制和移动 SomeClass
的赋值运算符并适本地实现它们。
附言
ABC
类,正如发布的那样,不是抽象基类。它没有任何纯虚函数。
关于c++ - 如何在构造期间从派生类实例初始化抽象基类数据成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25899645/