多态类对象的大小及虚函数表指针大小的模拟实现
时间: 2024-02-15 14:06:13 浏览: 83
多态类对象的大小也会比普通类对象的大小要大,因为多态类对象也包含了虚函数表指针。模拟实现可以如下:
```c++
#include <iostream>
using namespace std;
class A {
public:
A() {}
virtual void func() {}
};
class B : public A {
public:
B() {}
virtual void func() {}
};
int main() {
A* b = new B();
cout << "sizeof(*b) = " << sizeof(*b) << endl;
cout << "sizeof(void*) = " << sizeof(void*) << endl;
delete b;
return 0;
}
```
输出结果为:
```
sizeof(*b) = 8
sizeof(void*) = 8
```
可以看到,多态类对象的大小也为8字节,其中包含一个指向虚函数表的指针,大小也为8字节。
相关问题
多态类对象的大小及虚函数表指针的模拟实现
多态类对象的大小包含两部分内容:非静态数据成员和虚函数表指针。其中,虚函数表指针是一个指针,占用4个字节或8个字节(根据编译器和操作系统不同而异),用于指向虚函数表。
虚函数表的作用是存储虚函数的地址,以便在运行时动态绑定。虚函数表中存储的是虚函数的地址,而不是函数本身的代码,因此虚函数表的大小取决于类中虚函数的数目和编译器的实现方式。
下面是一个简单的模拟实现:
```c++
class A {
public:
virtual void func1() {}
virtual void func2() {}
private:
int m_data;
};
class B : public A {
public:
virtual void func1() {}
private:
char m_data;
};
int main() {
A* pa = new B();
delete pa;
return 0;
}
```
在上面的代码中,类A和B都是多态类,因为它们都含有虚函数。类A中包含一个虚函数表指针和一个int类型的数据成员,因此sizeof(A)的结果可能是8或12,具体取决于编译器和操作系统。类B继承自A,并覆盖了A中的一个虚函数,同时增加了一个char类型的数据成员,因此sizeof(B)的结果可能是12或16。
在main函数中,通过new运算符创建了一个B类型的对象,并将其指针赋值给了一个A类型的指针。在delete pa语句中,会自动调用B的析构函数,并释放内存。在释放内存之前,会先调用A的析构函数,然后再调用B的析构函数,最后才释放内存。这是因为虚函数表指针指向的是A的虚函数表,因此需要先调用A的析构函数,然后再调用B的析构函数。
c++多态类对象的大小及虚函数表指针的模拟实现
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()没有被覆盖。最后我们删除了这两个对象,避免内存泄漏。
需要注意的是,虚函数表指针的大小和虚函数表的大小是不确定的,取决于具体实现。此外,虚函数表指针通常被放在对象的开头,因此虚函数表通常被放在内存中较靠前的位置。
阅读全文