#include <iostream>
using namespace std;
class GrandParent {
public:
int variable1;
static int variable2;
int virtual show() { return 10; }
};
int GrandParent :: variable2 = 9;
class Parent1 : public virtual GrandParent {
public:
int show() { return 1; }
};
class Parent2 : public virtual GrandParent {
public:
int show() { return 9; }
};
class Child : public Parent1, public Parent2 {
public:
int variable1;
Child(){variable1 = 10; GrandParent::variable2 = 3;}
int show() { return 7; }
};
int main() {
GrandParent *objGrand = new Child();
GrandParent *objGrand1 = new Parent1();
Parent2 *objP = new Child();
Child *objChild = new Child();
int a = (objGrand->show())*(objP->show())*(objChild->show())*(objGrand1->show());
int b = (objGrand->variable1)*(objP->variable1)*(objChild->variable1);
int c = (objGrand->variable2)*(objP->variable2)*(objChild->variable2);
cout << a + b * c << endl;
return 0;
}
有人可以帮我理解原因(objGrand-&gt; variable1)= 0&amp; (objP-&gt; variable1)= 0而不是10? 这是我正在做的在线课程的一部分。他们发布了解决方案和解释。但是,我没有发现他们的解释令人信服,因此需要一些帮助。
答案 0 :(得分:4)
Child
重新声明成员变量variable1
。这为该类提供了具有该名称的变量,隐藏了从GrandParent
类继承的变量。所以当它的构造函数执行时:
variable1 = 10;
它分配给Child::variable1
,而不是GrandParent::variable1
。
虚拟访问成员变量,这仅适用于virtual
成员函数。所以,如果你再使用
objGrand->variable1
它引用GrandParent::variable1
,因为objGrand
是GrandParent*
,即使objGrand
指向Child
对象。由于GrandParent
没有初始化variable1
的构造函数,因此未初始化,而不是0
,并且使用它会导致未定义的行为。
要获得Child::variable1
,您需要向下转发它:
dynamic_cast<Child*>(objGrand)->variable1
出于同样的原因,objP
也是如此。