我有两个类Foo和Bar,冗余成员。我想要一个第三类FooBar,它包含两种类型的成员,我可以传递给期望任何一种类型的函数(可能带有一个强制转换),并且没有两个副本的所有东西都浮动。
class Foo{
public:
A a;
B b;
C c;
};
class Bar{
A a;
B b;
D d;
};
class FooBar{
A a;
B b;
C c;
D d;
};
在c ++中,无论如何都可以在不修改使用A或B的代码(或者至多更改代码期望的类型)的情况下执行此操作,而无需创建无关的副本或保留冗余数据?简单继承保留重复数据。具有公共基类和虚拟继承在clang下编译但看起来不起作用。
答案 0 :(得分:4)
编译器无法知道Foo::a
和Bar::a
引用相同的内容。这在你的程序中可能是合乎逻辑的,但在代码中的任何地方都不会强制执行。
如果他们真的有同样的意思,你可能想要一个共同的基础:
class AB {
public:
A a;
B b;
};
在其他地方使用虚拟继承:
class Foo : public virtual AB {
public:
C c;
};
class Bar : public virtual AB {
public:
D d;
};
class FooBar : public Foo, public Bar {
};
这样,只有一个FooBar::a
。