C++ 授权给姐妹-奇怪的行为

C++ 授权给姐妹-奇怪的行为,c++,inheritance,virtual,multiple-inheritance,C++,Inheritance,Virtual,Multiple Inheritance,下面的代码将打印什么?我理解前两行的输出,但第三行打印出我不理解的“Child”: #include <iostream> #define PRINT(a) std::cout << a << std::endl; class Parent { public: virtual void whoami() { PRINT("Parent"); } }; class Child : virtual public Parent

下面的代码将打印什么?我理解前两行的输出,但第三行打印出我不理解的“Child”:

#include <iostream>

#define PRINT(a) std::cout << a << std::endl;

class Parent {
public:
    virtual void whoami() {
        PRINT("Parent");
    }
};

class Child : virtual public Parent {
public:
    void whoami() {
        PRINT("Child");
    }
};

class GrandChild : virtual public Parent, virtual public Child {//changing the order of inheritance does not change anything
};

int main() {
    Parent *parent = new Parent;
    Child *child = new Child;
    GrandChild *grandChild = new GrandChild;

    parent->whoami();//prints "Parent"
    child->whoami();//prints "Child"
    grandChild->whoami();//Prints "Child". Why so?
    return 0;
}
为什么
Parent
whoami
方法中的
virtual
关键字没有改变任何东西


为什么更改继承顺序,即
虚拟公共父对象、虚拟公共子对象
虚拟公共子对象、虚拟公共父对象
相比不会更改任何内容?

您所说的“父对象的whoami方法中的virtual关键字不会更改输出”是什么意思?您是否尝试不使用该关键字,并且输出相同?对于
Child*green=new-green,您得到了哪些输出
父*孙=新孙?如果删除那里的virtual关键字呢?并不是说
virtual
授予基类的成员函数覆盖子类的成员函数。恰恰相反@Yunnosch推荐的实验应该可以证明这一点。这里有2个
virtual
关键字。virtual function关键字是必需的,只要没有
菱形继承
,就应该删除虚拟继承。虚函数允许继承的类重写函数。如果没有,则调用parents函数。对不起,我错过了
虚拟继承,这甚至在您的第一个问题中。虚拟继承是我很少需要但极力避免的事情。它使一切变得更加复杂。考虑到即使是像
inta,b<代码>int c=a-b熊未定义的行为(减法可能溢出),C++是非常复杂的,没有这个……-)“父对象的whoami方法中的virtual关键字不改变输出”是什么意思?您是否尝试不使用该关键字,并且输出相同?对于
Child*green=new-green,您得到了哪些输出
父*孙=新孙?如果删除那里的virtual关键字呢?并不是说
virtual
授予基类的成员函数覆盖子类的成员函数。恰恰相反@Yunnosch推荐的实验应该可以证明这一点。这里有2个
virtual
关键字。virtual function关键字是必需的,只要没有
菱形继承
,就应该删除虚拟继承。虚函数允许继承的类重写函数。如果没有,则调用parents函数。对不起,我错过了
虚拟继承,这甚至在您的第一个问题中。虚拟继承是我很少需要但极力避免的事情。它使一切变得更加复杂。考虑到即使是像
inta,b<代码>int c=a-b熊未定义的行为(减法可能溢出),C++是非常复杂的,没有这个……-)
Parent
Child
Child