例如,在这一段代码,如果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;
}
从GCC结果
$ g++ inh2.cpp
$ ./a.out
10
$
我有两个问题:
- 如何
ab->x
决心10
在上述情况下?该对象的类型为class B
,因此应该值为0
。 - 为什么评论
Line [a]
改变了代码的行为?我的推理是x
反正会继承,这应该导致相同的行为。
我给上述,Q#1推理:
ab
点的class B
对象的内存位置。从某种意义上说,它是一个物理对象,所有具有它们值的变量都被分配了内存。变量
x
此对象内存储值0
。当
ab->x
完成后,AB告诉我们对象的存储位置,我们去看看它里面找到x为0,所以我们应该打印0
我在哪里错了这里?
关于#1,在运行时,已知该对象的类型为'B',所以它不应该解析为0? – Lazer 2012-03-12 10:36:52
@拉泽尔,谁知道?我们知道它*是* B,但是我们拥有的指针是一个A,这就是将要使用的。为了测试这个,给B添加一个新成员'int y;'。现在做'ab-> y'。你会得到一个编译器错误,因为'y'不是'A'的成员。 – 2012-03-12 10:38:08
'ab'指向'B类'对象的内存位置。从某种意义上说,它是一个物理对象,所有具有它们的值的变量都被分配了内存并且存在。该对象中的变量'x'存储值'0'。当'ab-> x'完成时,ab告诉我们对象的内存位置,我们去查看它,发现x是'0'。所以我们应该打印'0'。不知道我在这里错过了什么? [we = compiler] – Lazer 2012-03-12 10:41:33