per*_*rry 7 c++ inheritance abstract-class
以下代码仅在您取消注释该行时才有效
virtual void FuncA() { ImplA::FuncA(); }
Run Code Online (Sandbox Code Playgroud)
在类中ImplB,否则我得到编译器错误:
无法实例化抽象类... FuncA(void)':是抽象的
问题是为什么不FuncA()从继承中获得实现ImplA?
class InterfaceA {
public:
virtual void FuncA()=0;
};
class InterfaceB : public InterfaceA {
public:
virtual void FuncB()=0;
};
class ImplA : public InterfaceA {
public:
virtual void FuncA() { printf("FuncA()\n"); }
};
class ImplB : public ImplA, public InterfaceB {
public:
// virtual void FuncA() { ImplA::FuncA(); }
virtual void FuncB() { printf("FuncB()\n"); }
};
{
ImplB *b = new ImplB();
InterfaceA *A= b;
A->FuncA();
InterfaceB *B= b;
B->FuncB();
B->FuncA();
}
Run Code Online (Sandbox Code Playgroud)
您遇到了多重继承中“钻石”问题的一个实例。您需要使用“虚拟”继承(相当于在继承时添加关键字 virtual)
问题在于 ImplB 有两条通往基类 InterfaceA 的路径。但是,您的意图是接口不提供任何实现。因此,您需要向编译器表明这一点,以便它可以统一纯虚函数。
为了更好的解释: http://www.cprogramming.com/tutorial/virtual_inheritance.html
我已经修改了您的代码以在您从接口继承时添加虚拟。现在它可以编译,即使该行被注释了。另请注意,我认为您缺少虚拟析构函数,因此您会遇到其他一些问题。此代码无需取消注释 FuncA 即可编译。
#include <cstdio>
class InterfaceA {
public:
virtual void FuncA()=0;
};
class InterfaceB : public virtual InterfaceA {
public:
virtual void FuncB()=0;
};
class ImplA : public virtual InterfaceA {
public:
virtual void FuncA() { printf("FuncA()\n"); }
};
class ImplB : public ImplA, public virtual InterfaceB {
public:
// virtual void FuncA() { ImplA::FuncA(); }
virtual void FuncB() { printf("FuncB()\n"); }
};
int main()
{
ImplB *b = new ImplB();
InterfaceA *A= b;
A->FuncA();
InterfaceB *B= b;
B->FuncB();
B->FuncA();
}
Run Code Online (Sandbox Code Playgroud)