c++多态类对象的大小的模拟实现
时间: 2024-02-12 18:08:28 浏览: 76
Mat_test.rar_矩阵类 C++ mat
C++中的多态性是通过虚函数和虚表来实现的。虚表是一个指向虚函数地址的指针数组,每个类都有自己的虚表。当我们定义一个类时,如果其中有虚函数,编译器就会自动生成一个指向该类虚表的指针 vptr。
假设我们有一个基类 Animal 和两个派生类 Cat 和 Dog,其中 Animal 中有一个虚函数 eat(),Cat 和 Dog 分别实现了 eat() 方法。现在我们创建了一个 Animal 类型的指针 p,指向一个 Cat 对象。
在这种情况下,p->eat() 调用的是 Cat 类中的 eat() 方法。但是,由于 p 是一个 Animal 类型的指针,编译器会根据 p 所指向的对象类型来确定调用哪个函数。因此,虚表的作用就在于解决这个问题。
下面是一个模拟实现多态类对象大小的代码示例:
```c++
#include <iostream>
using namespace std;
class Animal {
public:
virtual void eat() {
cout << "Animal is eating..." << endl;
}
};
class Cat : public Animal {
public:
void eat() {
cout << "Cat is eating..." << endl;
}
};
class Dog : public Animal {
public:
void eat() {
cout << "Dog is eating..." << endl;
}
};
int main() {
Animal *p;
p = new Cat();
cout << "Size of Animal: " << sizeof(Animal) << endl;
cout << "Size of Cat: " << sizeof(Cat) << endl;
cout << "Size of Dog: " << sizeof(Dog) << endl;
cout << "Size of Animal pointer: " << sizeof(p) << endl;
p->eat();
delete p;
return 0;
}
```
输出结果如下:
```
Size of Animal: 8
Size of Cat: 8
Size of Dog: 8
Size of Animal pointer: 8
Cat is eating...
```
可以看到,Animal、Cat 和 Dog 的大小都是 8,因为它们都有一个指向虚表的指针 vptr,而 Animal 类型的指针 p 的大小也是 8。
阅读全文