C++ C++;继承、成员和冗余数据

C++ C++;继承、成员和冗余数据,c++,inheritance,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++中

我有两个班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下编译,但似乎不起作用。

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

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

使用联合如何?如果您想将
FooBar
传递给期望
Foo
Bar
的函数,则需要使用继承。我认为设计有缺陷。类应该为行为建模,而不仅仅是数据。@Pradhan:一个联合会破坏这里的一切。@Cornstalks啊,我误解了这个问题,没有意识到他想要一个
Foo
Bar
:的集合论联合,那么使用联合会怎么样?如果你想将
FooBar
传递给期望
Foo
Bar
的函数,你需要使用继承。我认为这个设计有缺陷。类应该为行为建模,而不仅仅是数据。@Pradhan:一个联合会在这里破坏一切。@Cornstalks啊,我误解了这个问题,没有意识到他想要一个集理论于一体的
Foo
Bar
:)