C++ c+中的多重继承+;具有虚拟功能
我有以下代码:C++ c+中的多重继承+;具有虚拟功能,c++,multiple-inheritance,virtual-functions,C++,Multiple Inheritance,Virtual Functions,我有以下代码: class A { public: virtual void FA()=0; }; class B: public A { public: virtual void FB()=0; }; class Imp_A: public A { public: void FA() { // implement FA } }; class Imp_B :public Imp_A, public B { public: vo
class A
{
public:
virtual void FA()=0;
};
class B: public A
{
public:
virtual void FB()=0;
};
class Imp_A: public A
{
public:
void FA()
{
// implement FA
}
};
class Imp_B :public Imp_A, public B
{
public:
void FB()
{
// implement FB by calling FA()
FA();
// do some more work here.
}
};
在类Imp_B中,我不想实现FA,因为它已经在这个类所基于的Imp_A中实现了
但当我试图编译代码时,我得到了一个错误,即Imp_B是虚拟的,无法实例化
另外,当我试图在FB内部调用FA时,我得到了一个错误,即FA是不明确的
我怎样才能解决这个问题
请注意,Imp_A基于A并实现它,Imp_B基于Imp_A和B,其思想是使用Imp_A中A的实现,而只实现B
class B: public A
{
public:
virtual FB()=0;
}
您忘记将其显式声明为void
,因此声明:
virtual int FB()=0;
并在Imp_B
中声明:
void FB();
那当然不行。您没有覆盖任何内容。这看起来像是经典的“菱形继承问题”,在基类中定义了一个虚拟方法,该基类由两个或多个其他类继承,这些类用作多重继承的源 无论如何,虚拟继承是解决您问题的答案
class A
{
public:
virtual void FA()=0;
}
class B: virtual public A
{
public:
virtual void FB()=0; //probably a pure virtual function as well!?
}
class Imp_A: virtual public A
{
public:
void FA()
{
// implement FA
}
}
class Imp_B :public Imp_A, public B //since you call FA() you need it's implementation from Imp_A
{
public:
void FB()
{
// implement FB by calling FA()
FA();
// do some more work here.
}
}
这里的问题是Imp_b最终得到了来自两个A类定义的FA的to定义;使用虚拟继承有助于解决此问题。您的继承shema或多或少:
Imp_B
/ \
Imp_A B
| |
A A
这意味着您继承了A的两个不同实现。因此确实定义了Imp_A::FA
,但B::A
没有定义,因此类Imp_B
仍然是抽象的。它还解释了FA不明确的错误,因为它可以是Imp_A::FA
或B::A
解决方法:
- 您可以删除继承
。这样,类B:public A
和A
将只存在于一个分支中,并且所有分支都将被定义FA
- 您可以将基类
设置为虚拟,这意味着A
中只存在一个实例:Imp\u B
class B: virtual public A ... class Imp_A: virtual public A ...
A
还是imp\u A
。为了解决这个问题,您需要在它前面加上您想要从中实现它的基类,所以如果您想使用类A,那么您可以将A::FA
。不能实例化虚拟方法,但可以覆盖它们,因此需要指定覆盖该方法。我还没有使用C++,所以我记不住确切的语法(因此我为什么要评论而不是回答)。由于FA是在Imp_A中实现的,为什么我不能实例化Imp_B?@mtk99这不是该问题的重复,因为这里Imp_A基于A,并且在该问题上实现与虚拟类没有关系。您是对的,抱歉,实际错误是调用FA()代码>不明确(无法决定通过B
来的A::FA
和通过Imp\u A
来的A::FA
)。“Imp_B是虚拟的,无法实例化”是一个应该忽略的级联(发生这种情况是因为FA();
无法编译意味着FB(){……}
没有编译,因此该类没有被认为覆盖了纯虚拟定义)对不起,这是代码中的类型错误,我拥有的原始代码在实现和接口上都是无效的。谢谢,这并没有解决问题:你是说虚拟公共imp_A?即使这样也没有解决问题。我仍然得到同样的错误。好吧,我在这里编译了它:它编译得很好;请注意,您的原始代码中有一个输入错误FB()需要一个返回类型。我认为您还需要类Imp\u a:virtual public a
,以及类Imp\u B:public Imp\u a
。基本上,所有继承A的东西都需要虚拟地继承它。@Pandrei你能在cpp.sh上分享你的代码吗,这样我就可以用我的实现来检查它了?@MartinBonner;不是你不Imp_A不用于多重继承,Imp_B不需要从Imp_A继承,它已经有两个来自A和B的A类定义,另一个解决方案是明确指出Imp_A::FA()
(或者B::FA()
,如果其中一个有主体的话)@M.M:你在FB中调用FA是正确的,但这并不能解决Imp_B仍然是抽象的问题,除非它明确地覆盖B::FB不确定您在说什么,void FB()
inImp_B
覆盖virtual void FB()=0代码>在B