首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >虚函数与多态--代码解释

虚函数与多态--代码解释
EN

Stack Overflow用户
提问于 2018-06-07 08:53:22
回答 1查看 49关注 0票数 -1
代码语言:javascript
复制
#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?这是我正在做的一个在线课程的一部分。他们发布了解决方案和解释。然而,我并不认为他们的解释令人信服,所以我需要一些帮助。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-07 09:12:01

Child重新声明了成员变量variable1。这为该类提供了具有该名称的自己的变量,隐藏了从GrandParent类继承的变量。因此,当它的构造函数这样做时:

代码语言:javascript
复制
variable1 = 10;

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

成员变量不是虚拟访问的,这只对virtual成员函数有效。因此如果您随后使用

代码语言:javascript
复制
objGrand->variable1

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

要获取Child::variable1,您需要将其向下转换:

代码语言:javascript
复制
dynamic_cast<Child*>(objGrand)->variable1

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50731546

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档