我有这段代码:
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.
答案 0 :(得分:2)
这看起来像经典的"钻石继承问题"你有一个在基类中定义的虚方法,它由两个或多个其他类继承,这些类用作多重继承的源。
无论如何 - 虚拟继承是你问题的答案
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;使用虚拟继承有助于解决这个问题。
答案 1 :(得分:2)
你的遗产谢谢或多或少:
Imp_B
/ \
Imp_A B
| |
A A
这意味着你从A的两个不同实现继承。所以Imp_A::FA
确实被定义但B::A
不是,所以类Imp_B
仍然是抽象的。它还解释了FA不明确的错误,因为它可能是Imp_A::FA
或B::A
。
解决方法:
class B: public A
。这样A
和FA
只会存在于一个分支中,并且所有内容都将被定义您可以将基类A
设为虚拟,这意味着Imp_B
中只存在一个实例:
class B: virtual public A
...
class Imp_A: virtual public A
...
答案 2 :(得分:1)
class B: public A
{
public:
virtual FB()=0;
}
您忘记将其明确声明为void
,因此声明:
virtual int FB()=0;
在Imp_B
中你声明:
void FB();
当然,这不起作用。你没有覆盖任何东西。