我知道这里有很多关于vtables的问题,但我仍然有点困惑。Vtables只能用于指向基类的指针
只有当我们有一个指向基类的指针来解析派生类的哪个虚函数调用时,vtable才会被使用吗?
在我的例子中,在案例1中,在运行时是否使用了vtables,即使这个Tiger对象没有在堆/免费存储上动态创建?
在情况2中,是否使用了vtable,即使编译器知道我们正在指向一个Tiger对象。
情况3呢?
在此先感谢。
#include <iostream>
using namespace std;
class Animal // base class
{
public:
virtual void makeNoise() {cout<<" "<<endl;}
};
class Tiger: public Animal
{
public:
void makeNoise() {cout<<"Tiger Noise"<<endl;}
};
class Elephant: public Animal
{
public:
void makeNoise() {cout<<"Elephant Noise"<<endl;}
};
int main()
{
//case 1
Tiger t1;
Animal* aptr = &t1;
aptr->makeNoise(); // vtables used?
//case 2
Tiger t2;
Tiger* tptr = &t2; //vtables used ?
tptr->makeNoise();
//case 3
Elephant e1; //vtables used ?
e1.makeNoise();
}
如果通过类似于案例1的父类指针调用虚拟方法,将使用vtable。 – user2061057
@ user2061057 ...或父类引用... –
由编译器决定是使用还是不使用vtable在每个特定的情况下。如果编译器可以证明指向对象的派生类型是什么,那么在此调用中不使用vtable是完全可以的。 –