在这里的派生类中,如何解决歧义
How ambigity is solved in derived class here?
#include <iostream>
using namespace std;
class base
{
public:
virtual void function1(){
cout<<"base function1"<<endl;
}
virtual void function2()=0;
};
class base2
{
public:
virtual void function2()=0;
};
class derived : public base, base2
{
public:
void function2(){
cout<<"derived function"<<endl;
}
};
int main()
{
derived d;
d.function2();
d.function1();
}
这里的两个基类包含函数2()作为纯虚拟函数。派生的类继承两个基类。函数2()在派生中实现。在这种情况下,编译器如何解决歧义。欢迎输入。
没有歧义。如果您在derived
上调用function2()
,则编译器确切知道要调用哪个功能(IT的derived
版本)。如果您在base
或base2
打字指针/Ref上调用它,则编译器还知道该调用什么(通过该特定基础的虚拟函数表)。
在这种情况下,歧义发生了:
class base
{
public:
void func(){
cout<<"base func"<<endl;
}
};
class base2
{
public:
void func(){
cout<<"base2 func"<<endl;
}
};
class derived : public base, public base2
{
public:
void func2(){
func(); // ??? which one to call ???
}
};
为什么它在原始情况下起作用的原因是编译器使用derived::function2
同时实现base
和base2
版本。如果通过虚拟方法表实现它(只有一个可能的实现),则(AFAIK)通常在派生中为每个碱基提供两个虚拟表,并且两者都包含相同的function2
的指针。
程序的输出是:
derived function
base function1
另外,解决函数调用function2()
没有歧义,因为您使用了混凝土派生的类对象d
。class derived
具有其自己的成员函数function2()
。您只是尝试通过该类的对象调用类的成员函数。
我想您正在寻找多级继承的钻石问题。
相关文章:
- 歧义语法是如何解决的
- 使用enable_if解决多重继承歧义
- 如何解决传递给boost线程的函数中的歧义
- 解决虚拟方法的歧义继承的两种方法
- 解决歧义的方法
- 如何解决以下代码中的函数重载歧义
- 使用声明解决歧义
- 解决 CRTP 函数重载歧义问题
- 如何解决钻石问题的这种歧义
- 在size_t的声明中解决歧义
- LR解析器如何解决歧义和冲突
- 概念没有按预期解决歧义。代码示例有什么问题?
- 引用如何解决多重继承中的歧义
- 解决C++构造函数和调用歧义
- 如何解决嵌入结构内嵌入的操作员中的歧义
- 在这里的派生类中,如何解决歧义
- 用前瞻性解决歧义增强::精神::气语法
- 此关键字在启动器中用于解决歧义
- 使用双大括号,例如 Foo{{初始值设定项列表}} 来解决歧义
- 为什么 B::f 不能解决歧义,而 A::f 可以解决?