#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
被调用?一个小箭头图将非常感激。
this -> print();
只是 print()
并使用 vtable 来调用实际类型的成员,因为该函数是虚拟的。这就是虚函数的用途。
Base::print();
只是调用指定的函数,无论它是否是虚拟的。派生类经常使用它来首先调用基类函数,然后做自己的事情。