父类与子类的虚函数是否共用同一个虚函数表
结论:
1.如果子类重写虚函数,则父类与子类的虚函数表地址与虚函数表中虚函数的地址不相同
2.子类如果不重写虚函数,父类与子类的虚函数表地址不相同,但虚函数表中虚函数的地址相同
下面展示一些 子类不重写虚函数
。
#include<iostream>
using namespace std;
class Base{
public:
virtual void fun()
{
cout<<"This is Base Class"<<endl;
}
};
class Derived:public Base{
public:
};
int main()
{
Base B;
Derived D;
int **p=(int**)&B;
cout<<"基类的虚函数表地址:"<<p[0]<<endl;
cout<<"基类的虚函数表中虚函数的地址:0x"<<hex<<p[0][0]<<endl;
p=(int**)&D;
cout<<"派生类的虚函数表地址:"<<p[0]<<endl;
cout<<"派生类的虚函数表中虚函数的地址:0x"<<hex<<p[0][0]<<endl;
return 0;
}
基类的虚函数表地址:00ADDD5C
基类的虚函数表中虚函数的地址:0xad14c4
派生类的虚函数表地址:00ADDD70
派生类的虚函数表中虚函数的地址:0xad14c4
下面展示一些 子类重写虚函数
#include<iostream>
using namespace std;
class Base{
public:
virtual void fun()
{
cout<<"This is Base Class"<<endl;
}
};
class Derived:public Base{
public:
void fun()
{
cout<<"This is Derived Class"<<endl;
}
};
int main()
{
Base B;
Derived D;
int **p=(int**)&B;
cout<<"基类的虚函数表地址:"<<p[0]<<endl;
cout<<"基类的虚函数表中虚函数的地址:0x"<<hex<<p[0][0]<<endl;
p=(int**)&D;
cout<<"派生类的虚函数表地址:"<<p[0]<<endl;
cout<<"派生类的虚函数表中虚函数的地址:0x"<<hex<<p[0][0]<<endl;
return 0;
}
基类的虚函数表地址:00EBDD5C
基类的虚函数表中虚函数的地址:0xeb14c4
派生类的虚函数表地址:00EBDD70
派生类的虚函数表中虚函数的地址:0xeb14d3
请按任意键继续. . .
构造函数中是否能调用虚函数
对于在构造函数中调用一个虚函数的情况,被调用的只是这个函数的本地版本。也就是说,虚机制在构造函数中不工作。
如果我们在构造函数中调用虚函数,那么我们所调用的函数可能操作还没有被初始化的成员,这将导致灾难发生。