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++中多态是通过虚函数表实现的
- 虚函数表是由编译器自动生成与维护的
- 虚函数的调用效率低于普通成员函数