加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 需要多重继承吗?

发布时间:2020-12-16 10:11:39 所属栏目:百科 来源:网络整理
导读:我有如下情况: 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 som
我有如下情况:

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的混合物.
但是有一些已知的问题(例如,
Diamond problem).

另一个解决方案可能是组合

但是什么是正确的解决方案,请指教:)

提前致谢!

解决方法

some known problems (for example,Diamond problem).

第一:除非您明确创建菱形图案,否则没有菱形图案.

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的状态在两次调用中都会发生变异,则问题就会开始发生.

Another solution could be composition.

那也行.

class mixed: public A
 {
     B    b;
     C    c;
     public:
         virtual void f() override {b.f();}
         virtual void g() override {c.g();}
     ....
 };

But what is the correct solution

没有正确的解决方案.这在很大程度上取决于你没有提到的细节(比如A的细节).

但一般的建议是更喜欢构成而不是继承,但这只是一般性的建议细节总是归结为正在解决的实际问题.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读