父子間的賦值相容性原則:子類物件可以當作父類物件使用(相容性)
子類可以直接賦值給父類物件,子類物件可以直接初始化父類物件,父類指標可以直接指向子類物件,父類引用可以直接引用子類物件。
#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...