我知道不可能将一个抽象类的实例作为另一个类的基成员,即
#include <iostream>
class Base {
public:
Base() {};
virtual ~Base() {};
virtual int yield() = 0;
};
class C1: public Base {
public:
C1(): Base() {};
virtual ~C1() {};
virtual int yield() {return 1;};
};
class D {
public:
D(Base & b): b_(b) {};
virtual ~D() {};
private:
Base b_;
}
int main() {
C1 c;
D d(c);
}
编译失败
test.cpp:22:10: error: cannot declare field ‘D::b_’ to be of abstract type ‘Base’
明显的解决方法是改用(共享)指针。然而,这使得 main
阅读起来有些复杂,
int main() {
auto c = std::make_shared<C1>();
D d(c);
}
我真的很想避免。
有没有办法让 main
文件像上面的例子一样简单,同时仍然实现所需的功能?
最佳答案
你不能。当您创建 D
时,它会为 B
分配(在堆中或堆栈中)内存。并且 C1
类需要基类 B
的大小加上 C1
本身的额外变量/等的大小,即使没有任何新内容也是如此。
因此,请改用指针。
关于c++ - 存储抽象成员,保持接口(interface)简单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32107389/