gpt4 book ai didi

c++ - 是否需要多重继承?

转载 作者:太空狗 更新时间:2023-10-29 19:48:11 25 4
gpt4 key购买 nike

我的情况如下:

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()*/}
};

我在这里考虑多重继承。即,使 mixedBC 派生。但是有一些已知的问题(例如, Diamond problem ).

另一种解决方案可能是组合。

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

提前致谢!

最佳答案

some known problems (for example, Diamond problem).

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

 class mixed: public B, public C

这将使 B 和 C 混合继承。每个都有自己的显式 A(无菱形)。

因为 B 和 C 都有从 A 派生的虚拟成员,所以应该调用哪个变得不明确,但您已经通过在 mixed 中明确定义所有虚拟成员解决了这个问题(所以问题解决了)。

  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 有自己的状态(虽然这可能是个坏主意,通常最好将接口(interface)用作虚拟基类),但我们也没有问题,因为 mixed::f()mixed::g() 只在一个 child 中调用一个函数(如果他们同时调用双方和 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 的细节是什么)。

但是一般的建议是更喜欢组合而不是继承,但这只是一般的建议,具体总是归结为要解决的实际问题。

关于c++ - 是否需要多重继承?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31409061/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com