虚函数机制

Virtual function mechanism

本文关键字:机制 函数      更新时间:2023-10-16

代码如下:

#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*将调用它自己的虚方法。