![]() |
1
2
在与指针的静态类型对应的类中搜索函数声明。 因此,基类中声明的函数的调用与指针的动态类型无关。 您需要声明一个虚拟函数来提供动态类型。 例如
|
|
2
0
C++中对象的大小不取决于类中成员函数的数量。成员函数不是“存储”在对象实例中,而是放在最终二进制文件中的某个地方,可以从任何对象访问它们。 如果调用类的成员函数,编译器/链接器将引用该函数执行。 那么,如果有虚函数,对象如何知道要调用哪个函数呢? 具有虚函数的类的对象还具有一些隐藏的元数据(称为vtable,不同编译器的布局方式不同),这些元数据保存了指向调用虚函数时应调用的函数的指针。 这是对象知道要调用哪个虚函数(如果有的话)的机制。 从没有虚函数的类和有虚函数的类时的类大小差异可以看出这种隐藏元数据的演示:
1字节是因为对象不能没有大小,8字节对象基本上由指向vtable的指针组成。 |