C++ 授权给姐妹-奇怪的行为
下面的代码将打印什么?我理解前两行的输出,但第三行打印出我不理解的“Child”: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
#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