48 同名覆蓋引發的問題

2021-08-19 20:00:35 字數 1095 閱讀 9512

父子間的賦值相容性原則:子類物件可以當作父類物件使用(相容性)

子類可以直接賦值給父類物件,子類物件可以直接初始化父類物件,父類指標可以直接指向子類物件,父類引用可以直接引用子類物件。

#include

#include

using namespace std;

class parent

void add(int a, int b)

};class child : public parent

};int main()

void add(int a, int b)

void print()

};class child : public parent

void print()

};void how_to_print(parent* p)

int main()

{parent p;

child c;    

how_to_print(&p);    // expected to print: i'm parent.

how_to_print(&c);    // expected to print: i'm child.    

return 0;

與期望列印是不一致的列印出兩行   i'm parent.

問題分析:編譯期間,編譯器只能根據指標的型別判斷所指向的物件。根據賦值相容,編譯器認為父類指標指向的是父類物件。因此,編譯結果只可能是呼叫父類中定義的同名函式。

void how_to_print(parent* p)

p->print();

在編譯這個函式的時候,編譯器不可能知道指標p究竟指向了什麼。但是編譯器沒有理由報錯,於是,編譯器認為最安全的做法是呼叫父類的print函式,因為父類和子類肯定都有相同的print函式。(如果在執行時,p指標指向的是子類物件,那麼將這個prient函式解釋為父類中的版本,根據賦值相容性規則,也是正確的,於是編譯器都列印父類中的函式)

同名覆蓋帶來的問題,當子類重寫了父類中的某一函式時,有可能帶來以上問題。

子類物件可以當作父類物件使用(賦值相容),父類指標可以正確的指向子類物件,父類引用可以正確的代表子類物件,子類中可以重寫父類中的成員函式。

第48課 同名覆蓋引發的問題

1.1 子類物件可以 直接賦值 給父類物件 1.2 子類物件可以 直接初始化 父類物件 1.3 父類指標 可以直接指向子類物件 應該只能使用裡面相同的成員吧?1.4 父類引用 可以直接引用子類物件 子類物件的相容性 include include using namespace std class ...

C 48 同名覆蓋引發的問題

子類物件可以當做父類物件使用 相容性 上述 中,當使用父類指標 引用 指向子類物件的時候 子類物件退化為父類物件 只能訪問父類中定義的成員 可以直接訪問被子類覆蓋的同名成員 子類重定義父類中已經存在的成員函式,並且是在繼承中,這樣叫做函式重寫。函式重寫是同名覆蓋中特殊的一種情況。class pare...

同名覆蓋引發的問題

子類物件可以直接賦值給父類物件 子類物件可以直接初始化父類物件 父類指標可以直接指向子類物件 父類引用可以直接引用子類物件 同名覆蓋引發的問題.cpp 此檔案包含 main 函式。程式執行將在此處開始並結束。include class parent void add int x void add i...