C++ C++;继承、成员和冗余数据
我有两个班Foo和Bar,都有多余的成员。我想要一个第三类FooBar,它包含这两种类型的成员,我可以将这两种类型的成员传递到期望任何一种类型(可能带有强制转换)的函数中,而不需要两个浮动的副本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++中
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
:)