c++多态类对象的大小及虚函数表指针的模拟实现
时间: 2024-02-12 19:08:14 浏览: 214
C++中的多态性是通过虚函数实现的。在含有虚函数的类中,编译器会自动添加一个指向虚函数表的指针,这个指针通常称为虚函数表指针。虚函数表是一个存储类的虚函数地址的数组,每个类有一个对应的虚函数表。当一个类对象被创建时,会自动分配一个指向它的虚函数表的指针。
虚函数表指针的大小和虚函数表的大小都与具体实现相关。在一般情况下,虚函数表指针的大小为4或者8个字节,虚函数表的大小取决于类中虚函数的个数。
以下是一个模拟实现:
```c++
#include <iostream>
using namespace std;
class A
{
public:
virtual void func1()
{
cout << "A::func1" << endl;
}
virtual void func2()
{
cout << "A::func2" << endl;
}
};
class B : public A
{
public:
virtual void func1()
{
cout << "B::func1" << endl;
}
};
int main()
{
A* a = new A();
B* b = new B();
cout << "size of A: " << sizeof(A) << endl;
cout << "size of B: " << sizeof(B) << endl;
cout << "size of a: " << sizeof(a) << endl;
cout << "size of b: " << sizeof(b) << endl;
a->func1();
a->func2();
b->func1();
b->func2();
delete a;
delete b;
return 0;
}
```
输出结果:
```
size of A: 8
size of B: 8
size of a: 8
size of b: 8
A::func1
A::func2
B::func1
A::func2
```
在上面的代码中,我们定义了两个类A和B,其中B继承自A。类A和B都含有虚函数,因此编译器会为它们添加虚函数表指针。在main函数中,我们创建了一个A类对象和一个B类对象,并输出了它们的大小以及指针的大小。接着我们调用了每个对象的虚函数,可以看到B对象的func1()覆盖了A对象的func1(),而A对象的func2()没有被覆盖。最后我们删除了这两个对象,避免内存泄漏。
需要注意的是,虚函数表指针的大小和虚函数表的大小是不确定的,取决于具体实现。此外,虚函数表指针通常被放在对象的开头,因此虚函数表通常被放在内存中较靠前的位置。
阅读全文