[讨论]关于虚拟的讨论,大家都来聊聊自己的见解。
#include "stdafx.h"class A
{
public:
virtual void Draw()=0;
virtual void Eat()=0;
};
class B
{
public:
virtual void Eat()=0;
virtual void Draw()=0;
};
class C:public A,public B
{
public:
virtual void Draw(){printf("Draw\n");}
virtual void Eat(){printf("Eat\n");}
};
int main(int argc, char* argv[])
{
C*pc=new C;
A*pa=(A*)pc;
B*pb=(B*)pc;
pa->Draw();
pb->Eat();
pb=(B*)pa;
pb->Eat();
pa=(A*)(B*)(C*)pa;
pa->Draw();
return 0;
}
输出:
Draw
Eat
Draw
Eat
根据多继承虚拟类,派生类中有多个vtbl指针,所以将派生类指针转换成基类时,如果只是转换成第一个继承的基类,那么指针没有偏移,因为都指向类的内存快的开始处,而转换成第二个基类时,将会发生偏移.在调用虚拟函数时,似乎是根据虚拟函数在基类中的索引顺序来调用。比如是A类指针调用Draw就是调用虚表第一个函数,B类就是调用第二个函数。所以如果将一个B类指针转换成A类指针,然后调用A类的Draw函数,其实就是调用B类的Eat函数。