c++ - 如何在构造期间从派生类实例初始化抽象基类数据成员

标签 c++

我想执行以下等效操作来初始化数据成员 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/

相关文章:

c++ - 将数据从数据库正确加载到编辑控件中,以便我可以执行 ADO 查询

c++ - 如何优化涉及大量sql查询的Qt代码块?

c++ - 编译器选择了错误的运算符<<

c++ - 执行隐藏命令行?

c++ - "recursive on all control paths, function will cause runtime stack overflow"重载 << 运算符

c++ - 了解 OpenGL

c++ - 使用 return String1 - String2 == 0 进行相等性检查是否安全?

c++ - memset 在 C++ 中的一对数组

c++ - C++ 中的 std::map<key, data> 是否支持结构等 native 数据类型?

c++ - 线程中 sleep() 函数的用途是什么?