gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 01:15:50 24 4
gpt4 key购买 nike

比如这段代码中,如果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?该对象的类型为 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com