【发布时间】:2016-02-02 10:49:12
【问题描述】:
我正在考虑 C++ 中的多态机制,但我无法理解一件事。这里我有一段非常简单的代码,只有一个类:
#include <iostream>
using namespace std;
class A
{
public:
int x;
void fun1();
double fun2(int, char*);
void fun3(double, float[]);
};
int main()
{
cout << sizeof(A) << endl;
return 0;
}
在控制台上将打印 int 对象 (x) 的大小 - 很明显。如果我通过添加关键字 virtual 修改我的类,则大小将会改变,因为编译器正在添加指向虚拟函数数组(vtable)的指针。但是,在编写具有完全不同签名的新虚拟方法的声明时,我的类的大小怎么可能不会改变呢?我的意思是:
void (*(tab[100]) )(int, double, char*);
这是一个数组的定义,它必须具有带有签名的函数地址:
void fun(int, double, char*);
而且只有这种类型的函数可以添加到这个数组中,那么为什么无论哪种类型的虚方法类都只包含一个指向一个虚数组的指针呢?我的逻辑哪里出错了?
【问题讨论】:
-
澄清一下:vtable 不是每个类实例的一部分;它就像一个静态成员,只存在一次。
标签: c++ oop polymorphism