#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->variable1) =0& (objP->variable1) =0而不是10?这是我正在做的一个在线课程的一部分。他们发布了解决方案和解释。然而,我并不认为他们的解释令人信服,所以我需要一些帮助。
发布于 2018-06-07 09:12:01
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
也是如此。
https://stackoverflow.com/questions/50731546
复制相似问题