c – 需要多重继承吗?
我有如下情况:
class A { virtual void f() { /*some default impl here*/} virtual void g() { /*some default impl here*/} }; class B : public A { virtual void f() { /* do some specific stuff and call parent's f()*/} virtual void g() { /* do some specific stuff and call parent's g()*/} }; class C : public A { virtual void f() { /* do some specific stuff and call parent's f()*/} virtual void g() { /* do some specific stuff and call parent's g()*/} }; class mixed /* I don't know how to derive*/ { virtual void f() { /* call B::f()*/} virtual void g() { /* call C::g()*/} }; 我在考虑多重继承.即,制作来自B和C的混合物. 另一个解决方案可能是组合 但是什么是正确的解决方案,请指教:) 提前致谢! 解决方法
第一:除非您明确创建菱形图案,否则没有菱形图案. class mixed: public B,public C 这将使B和C混合继承.每个都有自己的显式A(无钻石). 由于B和C都有从A派生的虚拟成员,所以应该调用哪一个是模糊的,但是你已经通过对混合中所有虚拟的明确定义来解决这个问题(所以问题解决了). void mixed::f() { B::f();} // works fine. 现在即使您明确创建钻石. 注意:菱形图案不会正常显示.菱形图案是您必须明确制定的设计决策,您可以使用它来解决某些类型的问题(通过使用虚拟继承). class B: public virtual A ... class C: public virtual A ... class mixed: public B,public C ... 你仍然没有问题.因为mixed :: f()只使用B分支(然后是A).虽然mixed :: g()只使用C分支(然后是A). 即使A有自己的状态(尽管这可能是一个坏主意,通常最好将接口用作虚基类),但我们没有问题,因为只有mixed :: f()和mixed :: g()在一个孩子中调用一个函数(如果他们调用双方并且A的状态在两次调用中都会发生变异,则问题就会开始发生.
那也行. class mixed: public A { B b; C c; public: virtual void f() override {b.f();} virtual void g() override {c.g();} .... };
没有正确的解决方案.这在很大程度上取决于你没有提到的细节(比如A的细节). 但一般的建议是更喜欢构成而不是继承,但这只是一般性的建议细节总是归结为正在解决的实际问题. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |