1. 繼承對象模型
在C++編譯器的內部類可以理解為結構體,子類是由父類成員疊加子類新成員得到。疊加順序如下圖:
編程說明:繼承對象模型初探
#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;
}
輸出結果:
sizeof(Demo) = 8
sizeof(Derived) = 12
Before Changing ...
mi = 1, mj = 2, mk = 3
After Changing ...
mi = 10, mj = 20, mk = 30
2. 多態對象模型
C++多態的實現原理:
(1) 當類中聲明虛函數時,編譯器會在類中生成一個虛函數表;
(2) 虛函數表是一個存儲成員函數地址的數據結果
(3) 虛函數表由編譯器自動生成與維護
(4)virtual
成員函數會被編譯器放入虛函數表中
(5) 存在虛函數時,每個對象中都有一個指向虛函數表的指針(內存中虛函數指針的位置在成員變量之前,即第一個位置)
3. C語言實現多態【補充】
4. 小結
- 繼承的本質就是父子間成員變量的疊加
- C++中多態是通過虛函數表實現的
- 虛函數表是由編譯器自動生成與維護的
- 虛函數的調用效率低于普通成員函數