C++继承中父类和子类之间的赋值兼容
                                                            生活随笔
收集整理的這篇文章主要介紹了
                                C++继承中父类和子类之间的赋值兼容
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.                        
                                文章目錄
- 1 C++繼承中父類和子類之間的賦值兼容
 - 1.1 父子間的賦值兼容
 - 1.2 特殊的同名函數
 
1 C++繼承中父類和子類之間的賦值兼容
1.1 父子間的賦值兼容
在公有繼承的條件下,子類對象可以當作父類對象使用(兼容性):
- 子類對象可以直接賦值給父類對象。
 - 子類對象可以直接初始化父類對象。
 - 父類指針可以直接指向子類對象。
 - 父類引用可以直接引用子類對象。
 
在公有繼承的條件下,子類也被稱為父類的子類型。這種子類型關系具有單向傳遞性。
子類型的作用:
- 在需要父類對象的任何地方, 可以使用”公有派生”的子類的對象來替代,從而可以使用相同的函數統一處理基類對象和公有派生類對象即:形參為基類對象時,實參可以是派生類對象。
 
子類對象的兼容性:
#include <iostream> #include <string>using namespace std;class Parent { public:int mi;void add(int i){mi += i;}void add(int a, int b){mi += (a + b);} };class Child : public Parent { public:int mv;void add(int x, int y, int z){mv += (x + y + z);} };int main() {Parent p;Child c;p = c;Parent p1(c);Parent& rp = c;Parent* pp = &c;rp.mi = 100;rp.add(5); // 沒有發生同名覆蓋?rp.add(10, 10); // 沒有發生同名覆蓋?/* 為什么編譯不過? */// pp->mv = 1000;// pp->add(1, 10, 100);return 0; }當使用父類指針(引用)指向子類對象時:
- 子類對象退化為父類對象。
 - 只能訪問父類中定義的成員。
 - 可以直接訪問被子類覆蓋的同名成員。
 
1.2 特殊的同名函數
特殊的同名函數:
- 子類中可以重定義父類中已經存在的成員函數。
 - 這種重定義發生在繼承中,叫做函數重寫。
 - 函數重寫是同名覆蓋的一種特殊情況。
 
 思考一下:當函數重寫遇上賦值兼容會發生什么?
賦值兼容的問題:
#include <iostream> #include <string>using namespace std;class Parent { public:int mi;void add(int i){mi += i;}void add(int a, int b){mi += (a + b);}void print(){cout << "I'm Parent." << endl;} };class Child : public Parent { public:int mv;void add(int x, int y, int z){mv += (x + y + z);}void print(){cout << "I'm Child." << endl;} };void how_to_print(Parent* p) {p->print(); }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; }問題分析:
- 編譯期間,編譯器只能根據指針的類型判斷所指向的對象。
 - 根據賦值兼容,編譯器認為父類指針指向的是父類對象。
 - 因此,編譯結果只可能是調用父類中定義的同名函數。
 
 在編譯這個函數的時候,編譯器不可能知道p究竟指向了什么。但是編譯器沒有理由報錯,于是編譯器人為最安全的做法就是調用父類的print函數,因為父類和子類肯定都有相同的print函數。
編譯器的處理方法雖然是合理的,但并不是期望的。為了解決這個問題,需要引入多態。
參考資料:
總結
以上是生活随笔為你收集整理的C++继承中父类和子类之间的赋值兼容的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: Qt中的QWidget
 - 下一篇: Qt中的坐标系统