【问题标题】:inheritance in structs prototypes结构原型中的继承
【发布时间】:2020-05-01 20:03:05
【问题描述】:

是否可以用 C++ 表示:

struct foo {
    int x;
    int y;
    struct A derived;
};

struct A {
    int val;
};

struct B : A {
    int baz[10];
};

struct C : A {
    int baz[20];
};

derived 可以是 A(B 或 C)的任何继承结构,但不能是 A,而不更改原型 struct foo? 例如是否可以执行以下操作?

void func(void)
{
    struct B b;
    struct foo foo;
    foo.derived = b;
}

【问题讨论】:

  • 派生将始终是 A。不是 B,不是 C。如果您想要派生的多态性应该是指向 A 的指针/引用。
  • 如果它永远不可能是A,那为什么要提供A呢?

标签: c++ inheritance c++98


【解决方案1】:
struct A {
    int val;
    virtual ~A() = 0; // so nobody can instantiate A alone.
};
inline
A::~A() = default; // the destructor HAS to be defined.

struct foo {
    int x;
    int y;
    std::unique_ptr<A> derived;
};

然后其余的都是一样的......并使用:

foo foo_v;  foo_v.derived = std::make_unique<B>();

请注意,我已经消除了 C 语言元素并使其成为纯 C++。我也会清理这些并使它们更具凝聚力。在上面的代码中未初始化 x 和 y 是否有意义?可能不会,所以应该有一个构造函数来强制提供它们,将它们设置为初始值,或两者兼而有之。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-07
    • 2010-09-28
    • 2013-11-07
    • 2013-06-18
    • 2013-05-20
    • 2010-09-28
    • 2018-02-21
    相关资源
    最近更新 更多