c++ - 存储抽象成员,保持接口(interface)简单

标签 c++ abstract-class shared-ptr

我知道不可能将一个抽象类的实例作为另一个类的基成员,即

#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/

相关文章:

c++ - 没有用于方法调用的可行的 std::weak_ptr 到 std::shared_ptr 的转换

c++ - `shared_ptr` 破坏了对象的常量性

c++ - "unreachable code"简单单行函数中的警告

java - 类继承的数组值限制

具有动态类型的 C# 接口(interface)/抽象类

c++ - 如何为通过共享指针在不同模块之间传递的模板类分配内存

c++ - 如何在 C++ 中处理具有多个不同类型数据成员的类?

c++ - wxwidget wxRichTextCtrl编译结果在ld : symbol(s) not found

c++ - 调用 create_pthread() 的 Cast 成员函数

java - 在其成员方法中实例化抽象类