1. 繼承對象模型
在C++編譯器的內(nèi)部類可以理解為結(jié)構(gòu)體缕探,子類是由父類成員疊加子類新成員得到。疊加順序如下圖:
編程說明:繼承對象模型初探
#include <iostream>
#include <string>
using namespace std;
class Demo
{
protected:
int mi;
int mj;
};
class Derived : public Demo
{
int mk;
public:
Derived(int i, int j, int k)
{
mi = i;
mj = j;
mk = k;
}
void print()
{
cout << "mi = " << mi << ", "
<< "mj = " << mj << ", "
<< "mk = " << mk << endl;
}
};
struct Test
{
int i;
int j;
int k;
};
int main()
{
cout << "sizeof(Demo) = " << sizeof(Demo) << endl;
cout << "sizeof(Derived) = " << sizeof(Derived) << endl;
cout << "Before Changing ... " << endl;
Derived d(1, 2, 3);
d.print();
Test* p = reinterpret_cast<Test*>(&d);
p->i = 10;
p->j = 20;
p->k = 30;
cout << "After Changing ... " << endl;
d.print();
return 0;
}
輸出結(jié)果:
sizeof(Demo) = 8
sizeof(Derived) = 12
Before Changing ...
mi = 1, mj = 2, mk = 3
After Changing ...
mi = 10, mj = 20, mk = 30
2. 多態(tài)對象模型
C++多態(tài)的實現(xiàn)原理:
(1) 當(dāng)類中聲明虛函數(shù)時候址,編譯器會在類中生成一個虛函數(shù)表;
(2) 虛函數(shù)表是一個存儲成員函數(shù)地址的數(shù)據(jù)結(jié)果
(3) 虛函數(shù)表由編譯器自動生成與維護(hù)
(4)virtual
成員函數(shù)會被編譯器放入虛函數(shù)表中
(5) 存在虛函數(shù)時,每個對象中都有一個指向虛函數(shù)表的指針(內(nèi)存中虛函數(shù)指針的位置在成員變量之前大猛,即第一個位置)
3. C語言實現(xiàn)多態(tài)【補(bǔ)充】
4. 小結(jié)
- 繼承的本質(zhì)就是父子間成員變量的疊加
- C++中多態(tài)是通過虛函數(shù)表實現(xiàn)的
- 虛函數(shù)表是由編譯器自動生成與維護(hù)的
- 虛函數(shù)的調(diào)用效率低于普通成員函數(shù)