非虚方法调用虚方法时vtable和vptr如何工作

问题描述 投票:0回答:1
#include <bits/stdc++.h>
using namespace std;
class Base
{
public:
    virtual void print()
    {
        cout << "Base class print function \n";
    }
    void invoke()
    {
        cout << "Base class invoke function \n";
        this -> print(); // case: 1
        this -> print(); // case: 2
        Base::print();   // case: 3
    }
};
 
class Derived: public Base
{
public:
    void print()
    {
        cout << "Derived class print function \n" ;
    }
    void invoke()
    {
        cout << "Derived class invoke function \n";
        this -> print(); 
    }
};
 
int main()
{
    Base *b = new Derived;
    b -> invoke();
    return 0;
}

对于上面的代码,我很难理解派生类和基类的 vptr 和 vtable 如何为注释 1、2 和 3 工作。为什么在情况 1 和情况 2 中派生

print
被调用?一个小箭头图将非常感激。

c++ vtable
1个回答
0
投票

this -> print();
只是
print()
并使用 vtable 来调用实际类型的成员,因为该函数是虚拟的。这就是虚函数的用途。

Base::print();
只是调用指定的函数,无论它是否是虚拟的。派生类经常使用它来首先调用基类函数,然后做自己的事情。

© www.soinside.com 2019 - 2024. All rights reserved.