Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么这段代码是;不含糊"E;”虚拟函数_C++_Multiple Inheritance_Virtual Functions_Ambiguous_Name Lookup - Fatal编程技术网

C++ 为什么这段代码是;不含糊"E;”虚拟函数

C++ 为什么这段代码是;不含糊"E;”虚拟函数,c++,multiple-inheritance,virtual-functions,ambiguous,name-lookup,C++,Multiple Inheritance,Virtual Functions,Ambiguous,Name Lookup,为什么下面的代码不含糊,它是如何工作的 #include <QCoreApplication> #include <iostream> using namespace std; class Shape{ public: virtual void drawShape(){ cout << "this is base class and virtual function\n"; } }; class Line : public

为什么下面的代码不含糊,它是如何工作的

#include <QCoreApplication>
#include <iostream>
using namespace std;

class Shape{
public:
    virtual void drawShape(){
        cout << "this is base class and virtual function\n";
    }
};

class Line : public Shape{
public:
    virtual void drawShape(){
        cout << "I am a line\n";
    }
};

class Circle : public Shape{
public:
    virtual void drawShape(){
        cout <<" I am circle\n";
    }
};

class Child : public Line, public Circle{
public:
    virtual void drawShape(){
        cout << "I am child :)\n";
    }
};

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    //Shape *s;
    //Line l;
    Child ch;
    //s = &l;
    //s = &ch;
    ch.drawShape(); // this is ambiguous right? but it executes properly!
    //s->drawShape();
    return a.exec();
}
#包括
#包括
使用名称空间std;
阶级形态{
公众:
虚空drawShape(){

cout它不是不明确的,因为
Child
定义了它自己对
drawShape
的覆盖,并且
ch.drawShape
将调用该函数。如果
Child
没有提供对
drawShape
的覆盖,那么调用将是不明确的。

它不是不明确的,因为
Child
定义了它自己的覆盖
drawShape
的e和
ch.drawShape
将调用该函数。如果
Child
未提供对
drawShape
的重写,则调用将是不明确的。

但即使我删除基类中的虚拟关键字,即使它正在工作!@highlander141这里的基类与不明确无关。它是w正如我已经解释过的那样,在打电话的时候,我们知道什么使它变得模棱两可。
class-Child:public-Line,public-Circle{};
Child-ch;ch.drawShape();
将给出错误,因为编译器不知道您想要的是
Line::drawShape
Circle::drawShape
,还是两者兼而有之。@默认情况下继承了highlander141虚拟行为。您告诉我们,即使在删除关键字Virtual之后,您也看不到问题。关键字Virtual在派生类中是可选的。如果不是指定时,任何在基类中定义为virtual的函数在派生类中默认为virtual。但即使我删除基类中的virtual关键字,即使它正常工作!@highlander141此处的基类与歧义无关。正如我已经解释的,调用时已知的情况使其变得歧义。
class Child:public Line,public Circle{};
..
Child ch;ch.drawShape();
将给出错误,因为编译器不知道您想要的是
Line::drawShape
Circle::drawShape
,还是两者兼而有之。@默认情况下继承了highlander141虚拟行为。您告诉我们,即使在删除关键字Virtual之后,您也看不到问题。关键字Virtual在派生类中是可选的。如果不是指定后,任何在基类中定义为虚拟的函数在派生类中默认为虚拟。这不是一个例子,这是完全不同的。@Boperson它与
虚拟继承
有什么不同?是的@Boperson,但我使用的继承是菱形问题的一个例子。我有点困惑regarding“歧义调用”这不是一个完全不同的例子。@BoPersson它与
虚拟继承
有何不同?是的@BoPersson,但我使用的继承是菱形问题的一个例子。我对“歧义调用”有点困惑