C ++继承,成员和冗余数据

时间:2014-12-20 20:25:11

标签: c++ inheritance

我有两个类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下编译但看起来不起作用。

1 个答案:

答案 0 :(得分:4)

编译器无法知道Foo::aBar::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