Структурное наследование без дублирования родительской структуры - PullRequest
0 голосов
/ 06 ноября 2019

В моем коде у меня есть две почти идентичные структуры, которые я здесь упростил:

struct foo {
    struct bar {
        int b;
    } a;
};

struct foo2 {
    struct qux {
        int b;
        int c;
    } a;
};

(Единственное отличие здесь в том, что у qux есть член c, а у bar нет.)

Мой вопрос таков: Есть ли способ позволить qux наследоваться от bar без необходимости создавать два foo? Это легко сделать с помощью классов, но я хочу знать, можно ли этого достичьсо структурами. В моем воображении это выглядело бы примерно так:

struct bar {
    int b;
};

struct qux : bar {
    int c;
};

struct foo {
    bar_or_qux a;
};

Ответы [ 2 ]

1 голос
/ 07 ноября 2019

Вот фрагмент, опубликованный в комментарии к ответу Рикардо.

struct bar {
    int b;
};

struct qux : bar {
    int c;
};

struct foo {
    bar a;
};

int main() {
    qux q;
    foo f;
    f.a = q;
    f.a.b = 7;
    // f.a.c = 3;
}

Подобные вещи могут работать в Python или JavaScript, но это C ++. Присвоение qux bar магическим образом не превращает bar в qux. Это f.a = q называется нарезкой . Я не уверен, что именно вы хотите, но я сделаю несколько предположений и, возможно, я наткнусь на это.


Вы можете использовать шаблоны. Это будет означать, что у вас может быть тип «foo with qux» и тип «foo with bar».

struct bar {
    int b;
};

struct qux : bar {
    int c;
};

template <typename T>
struct foo {
    T a;
};

int main() {
    qux q;
    foo<qux> f;
    f.a = q;
    f.a.b = 7;
    f.a.c = 3;
}

Вы можете использовать полиморфизм. Это будет означать, что вы можете иметь один тип foo, который может хранить подкласс bar (например, qux).

#include <memory>

struct bar {
    int b;

    virtual void setC(int) = 0;
};

struct qux : bar {
    int c;

    void setC(const int value) override {
        c = value;
    }
};

struct foo {
    std::unique_ptr<bar> a;
};

int main() {
    qux q;
    foo f;
    f.a = std::make_unique<qux>(q);
    f.a->b = 7;
    f.a->setC(3);
}

Надеюсь, это поможет!

0 голосов
/ 06 ноября 2019

Вы можете использовать наследование со структурами так же, как и классы.

Структуры в C ++ имеют все те же возможности, что и классы, с той лишь разницей, что их члены (объявления) и базы (наследование)public по умолчанию, в то время как для классов они являются приватными по умолчанию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...