例如,在这段代码中,如果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
$
我有两个问题:
- 在上述情况下,
ab->x
如何解析为10
?该对象的类型为class B
,因此值应为0
。 - 为什么注释
Line [a]
会改变代码的行为?我的推理是x
无论如何都会被继承,这应该会导致相同的行为。
我对上面问题 #1 的推理:
ab
指向B类
对象的内存位置。从某种意义上说,它是一个物理对象,所有变量及其值都被分配了内存。此对象内的变量
x
存储值0
。当
ab->x
完成后,ab告诉我们对象的内存位置,我们查看它的内部,发现x是0。所以我们应该打印0。
我哪里错了?
最佳答案
是的,它的类型是
B
,但您将其指定为指向A
的指针,因此它使用x
在 A 上定义(就像当我们处理指向 A 的指针时,我们不知道B
甚至存在,即使这是您分配的)。当您在构建阶段注释掉该行时,
A
首先调用 s 构造函数,然后调用B
s 构造函数,设置x
(在其基类中)为 0。只有一个x
此时,Bs 构造函数最后被调用。
关于c++ - 继承:为什么继承的变量和提供的变量之间存在行为差异?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9665422/