наследование в конструкциях прототипов - PullRequest
0 голосов
/ 01 мая 2020

Можно ли представить это в 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;
}

1 Ответ

1 голос
/ 01 мая 2020
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 неинициализированы в приведенном выше коде? Вероятно, нет, поэтому должен существовать конструктор, который заставляет их указывать, устанавливает для них начальное значение или оба.

...