gpt4 book ai didi

c++ - 多类继承设置问题

转载 作者:行者123 更新时间:2023-11-28 06:48:26 26 4
gpt4 key购买 nike

我有 3 个这样的接口(interface)(纯虚拟)类

class A {
virtual void M1() = 0;
virtual void M2() = 0;
};

class B : public A {
virtual void M3() = 0;
};

class C : public A {
virtual void M4() = 0;
};

我有这样的实现者

class Aimpl : A {
void M1 () override {};
void M2 () override {};
}

class Bimpl: public Aimpl, public B{
void M3() override {};
}

class Cimpl: public Aimpl, public C{
void M4() override {};
}

Bimpl b = Bimpl();
b.M2() // Error. M2 is ambigous. Can be from Aimpl or A

有什么简单的方法可以解决这个问题?我希望能够在函数中传递 B 或 C 而不是 Bimpl

最佳答案

本质上,Bimpl 中有两种不同的M2 方法:Aimpl::M2B::M2。你遇到了 diamond-inheritance problem .

要修复它,您应该使用虚拟继承。 This question提供了一个很好的概述。本质上,你应该使用这样的东西:

class A {
virtual void M1() = 0;
virtual void M2() = 0;
};

class B : public virtual A {
virtual void M3() = 0;
};

class C : public virtual A {
virtual void M4() = 0;
};

class Aimpl : public virtual A {
void M1 () override {};
void M2 () override {};
};

class Bimpl: public virtual Aimpl, public virtual B {
void M3() override {};
};

class Cimpl: public virtual Aimpl, public virtual C {
void M4() override {};
};

请注意,我对虚拟继承不是 super 熟悉,所以这可能是也可能不是应用虚拟继承的最佳方式。

关于c++ - 多类继承设置问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24496339/

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