Вот фрагмент, опубликованный в комментарии к ответу Рикардо.
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);
}
Надеюсь, это поможет!