虚函数和多态 - 代码解释

时间:2018-06-07 00:53:22

标签: c++

#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? 这是我正在做的在线课程的一部分。他们发布了解决方案和解释。但是,我没有发现他们的解释令人信服,因此需要一些帮助。

1 个答案:

答案 0 :(得分:4)

Child重新声明成员变量variable1。这为该类提供了具有该名称的变量,隐藏了从GrandParent类继承的变量。所以当它的构造函数执行时:

variable1 = 10;

它分配给Child::variable1,而不是GrandParent::variable1

虚拟访问成员变量,这仅适用于virtual成员函数。所以,如果你再使用

objGrand->variable1

它引用GrandParent::variable1,因为objGrandGrandParent*,即使objGrand指向Child对象。由于GrandParent没有初始化variable1的构造函数,因此未初始化,而不是0,并且使用它会导致未定义的行为。

要获得Child::variable1,您需要向下转发它:

dynamic_cast<Child*>(objGrand)->variable1

出于同样的原因,objP也是如此。