虚函数机制
Virtual function mechanism
代码如下:
#include <iostream>
using namespace std;
class T {
public:
virtual int f(int x) { cout << "T::f" << endl; return 0; }
void g() { f(1); cout << "T::g" << endl; }
virtual void h() { g(); cout << "T::h" << endl; }
};
class S: public T {
public:
int f(double y) { cout << "S::f" << endl; return 2; }
virtual void g() { f(1); cout << "S::g" << endl; }
virtual void h() { g(); cout << "S::h" << endl; }
};
int main() {
T t; S s; T * p = &s;
p -> f(1.5);
p -> g();
p -> h();
return 0;
}
我很困惑到底哪些函数会被执行,即使我在几本教科书中读到虚函数机制。如有任何帮助,我将不胜感激。
更新:我已经运行了代码,输出是:
T::f
T::f
T::g
S::f
S::g
S::h
我不明白,例如,当我们已经在函数内部时,我们如何选择要执行哪些函数。
在你的类T将无声地创建指针的虚表函数(你可以找到它存在,如果你将调用sizeof(T),它将在sizeof(void*),然后必须)。你的类S也会有这样一个指向另一个虚表的指针。
这种虚表只有指向函数的指针。
当你的类S被创建时,它从T中复制了虚表,然后用S中定义的函数指针替换T中定义的函数指针。所以,它不会替换函数f()的指针,因为你没有在S中定义它,但它会替换函数h()的指针,因为你在S中重新定义了它。
所以,当你得到一个带有虚表的对象时,第一个指针指向T::f(),第二个指针指向S::h()。你试着像操作对象t一样操作这个对象
所以,当你调用f() -时,你会收到好像T::f()被调用。当你调用h() -你收到的好像S::h()被调用。
不带"virtual"的方法不向该表输入。因此,T*现在将知道在子类中添加的虚方法,并且如果它没有在对象中重新定义,T*将调用它自己的虚方法。
相关文章:
- "error: no matching function for call to"构造函数错误
- 什么时候调用组成单元对象的析构函数
- 继承函数的重载解析
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- C++ 中的纯虚函数机制如何公开来自 DLL 的函数
- 派生类中函数参数变化的虚函数按常量类型在"function parameter"会破坏虚拟机制吗?
- C++:使用回调机制调用函数
- C++模板机制只是一个类型构建器函数吗
- 参考虚拟构造函数的虚拟函数机制
- 如何不优化 - 愚蠢函数的机制
- C++模板机制来获取函数参数的数量,这将适用于 lambda 和普通函数
- QPixmap的loadFromData函数使用了一些奇怪的缓存机制?
- java arraylist有任何类似c++vector capacity()的函数,或者机制不同
- 在虚拟析构函数的情况下,虚拟机制是如何工作的
- 虚函数机制
- 虚函数调用机制
- 具有私有构造函数的类的私有继承的工作机制
- 使C函数指针与C++中基于C样式堆栈的调用机制一起工作
- 当我从赋值操作符返回值时,首先,调用复制构造函数的机制和基础是什么?
- 为什么纯虚拟机制不考虑继承函数?