1.父子間的賦值兼容(兼容性)
a.子類對象可以直接賦值給父類對象 b.子類對象可以直接初始化父類對象
c.父類指針可以直接指向子類對象 d.父類引用可以直接引用子類對象
賦值 指針(退化)
子類 ==> 父類 子類 ==> 父類
初始化 引用(退化)
當父類指針(引用)指向子類對象時 a.子類對象退化爲父類對象 b.只能訪問父類中定義的成員
eg:
#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;
}
2.函數重寫
a.子類中可以重定義父類中已經存在的成員函數(同名函數) b.這種重定義發生在繼承中,叫做函數重寫 c.函數重寫是同名覆蓋的一種特殊情況
問題:如何解決父子類兼容時子類退化,不能使用子類中的成員?
問題分析: a.編譯期間,編譯器只能根據指針的類型判斷所指的對象 b.根據賦值兼容,編譯器認爲父類指針指向的是父類對象 c.因此編譯結果只可能是調用父類中定義的同名函數
解決辦法:見49課多態