多态类对象的大小及虚函数表指针的模拟实现全带注释的
时间: 2024-02-16 16:00:19 浏览: 77
多继承时的虚函数表-cpp多态
首先,我们需要了解多态类对象的存储方式。多态类对象通常会包含一个指向虚函数表的指针,该指针指向一个由编译器生成的虚函数表,其中存储了该类及其基类的虚函数地址。因此,多态类对象的大小会包含额外的指针大小。
以下是一个模拟实现多态类对象的代码,其中包含了注释说明:
```c++
#include <iostream>
#include <vector>
using namespace std;
// 基类
class Shape {
public:
// 虚函数
virtual void draw() {
cout << "Drawing shape..." << endl;
}
};
// 派生类
class Circle : public Shape {
public:
// 重写虚函数
void draw() {
cout << "Drawing circle..." << endl;
}
};
// 派生类
class Square : public Shape {
public:
// 重写虚函数
void draw() {
cout << "Drawing square..." << endl;
}
};
int main() {
// 定义一个指向基类的指针
Shape* shape;
// 定义一个圆形对象
Circle circle;
// 定义一个正方形对象
Square square;
// 将指针指向圆形对象
shape = &circle;
// 调用虚函数,输出 "Drawing circle..."
shape->draw();
// 将指针指向正方形对象
shape = □
// 调用虚函数,输出 "Drawing square..."
shape->draw();
// 计算多态类对象的大小
cout << "Size of Circle object: " << sizeof(circle) << endl;
// 计算多态类对象的大小
cout << "Size of Square object: " << sizeof(square) << endl;
// 计算多态类对象指针的大小
cout << "Size of Shape pointer: " << sizeof(shape) << endl;
return 0;
}
```
输出结果为:
```
Drawing circle...
Drawing square...
Size of Circle object: 8
Size of Square object: 8
Size of Shape pointer: 8
```
可以看到,圆形对象和正方形对象的大小都是8字节,其中包括了一个指向虚函数表的指针。而指向多态类对象的指针大小也是8字节。这个大小的计算可能会因为编译器的不同而有所差异。
虚函数表的指针是如何实现的呢?一种常见的实现方式是在多态类对象的开头处添加一个指向虚函数表的指针。因此,在调用多态类对象的虚函数时,程序会先访问对象的虚函数表指针,然后根据虚函数表指针存储的地址找到虚函数的实现。这种实现方式可以保证多态类对象的虚函数调用的正确性。
阅读全文