c++ - 继承:为什么继承的变量和提供的变量之间存在行为差异?

标签 c++ inheritance

例如,在这段代码中,如果line [a]被注释掉,则输出为0。

inh2.cpp

#include<iostream>
using namespace std;

class A {
    public:
        int x;
        A() { x = 10; }
};

class B : public A {
    public:
        int x;  // <--------- [a]
        B() { x = 0; }
};

int main() {
    A* ab = new B;
    cout << ab->x << endl;
}

results from gcc

$ g++ inh2.cpp
$ ./a.out
10
$

我有两个问题:

  1. 在上述情况下,ab->x 如何解析为 10?该对象的类型为class B,因此值应为0
  2. 为什么注释Line [a]会改变代码的行为?我的推理是 x 无论如何都会被继承,这应该会导致相同的行为。

我对上面问题 #1 的推理:

  • ab指向B类对象的内存位置。从某种意义上说,它是一个物理对象,所有变量及其值都被分配了内存。

  • 此对象内的变量 x 存储值 0

  • ab->x完成后,ab告诉我们对象的内存位置,我们查看它的内部,发现x是0。所以我们应该打印0。

我哪里错了?

最佳答案

  1. 是的,它的类型是 B ,但您将其指定为指向 A 的指针,因此它使用 x在 A 上定义(就像当我们处理指向 A 的指针时,我们不知道 B 甚至存在,即使这是您分配的)。

  2. 当您在构建阶段注释掉该行时,A首先调用 s 构造函数,然后调用 B s 构造函数,设置 x (在其基类中)为 0。只有一个 x此时,Bs 构造函数最后被调用。

关于c++ - 继承:为什么继承的变量和提供的变量之间存在行为差异?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9665422/

相关文章:

c++ - 在 Qt 服务器上验证用户

c++ - 如何使用 Voro++ 库获取容器中所有单元格的顶点?

java - 为什么要使用额外的显式 'implements' 子句?

c++ - 关于继承和覆盖的问题

c# - 创建基本用户控件

c++ - 从程序集引导加载程序调用 C++

c++ - 为什么 GCC 不能将此使用声明解析为正确的类型

c++ - 在每一新行后添加一个空格

c++ - 具有混合属性的烦人的类层次结构

c++ - 使用模板和继承的容器实现