C++ 中具有虚函数的多重继承
Multiple inheritance in c++ with 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:
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 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;使用虚拟继承有助于解决这个问题。
你的继承或多或少是:
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 ...
class B: public A
{
public:
virtual FB()=0;
}
你忘了明确声明这是void
,所以这声明:
virtual int FB()=0;
在Imp_B
中,您声明:
void FB();
当然,这是行不通的。你没有覆盖那里的任何东西。
相关文章:
- 如何在 c++ 多重继承中调用父非虚函数?
- 多重继承导致虚假的模糊虚拟函数过载
- 带有此指针的模板类多重继承构造函数不起作用?
- 仅函数的多重继承 - 没有虚拟和 CRTP
- 从多重继承中的派生类函数调用适当的父类函数
- C++具有多重继承的构造函数重载解析
- 指针到成员函数和多重继承
- 使用具有虚拟多重继承的基构造函数
- 多重继承:调用所有覆盖的函数
- 具有虚拟多重继承的构造函数定义
- 实现具有多重继承的纯虚函数
- 多重继承析构函数调用他自己和父析构函数?c++
- 没有匹配的函数调用CTOR,多重继承
- 具有多重继承的纯虚函数重载和协变返回类型
- 多重继承、复制构造函数和基类初始化
- 在多重继承(菱形)中,祖父的默认构造函数称为
- 继承受保护的函数和公共变量C++时发生多重继承编译错误
- 纯虚拟函数和多重继承
- 没有函数重写的多重继承.为什么模棱两可
- 从未知的派生类调用接口函数(多重继承)