例如,在這一段代碼,如果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