转自: https://www.cnblogs.com/balingybj/p/4764739.html.
昨天去面试一家公司,面试题中有一个题,自己没弄清楚,先记录如下:
class D
{
public:
void printA()
{
cout<<"printA"<<endl;
}
virtual void printB()
{
cout<<"printB"<<endl;
}
};
main函数调用:
D *d=NULL;
d->printA();
d->printB();
输出结果是?
当时想的是对象d直接初始化为NULL,非虚的成员函数没有地址,应该找不到,而virtual成员函数,由于对象会有指向虚拟函数表的指针-vptr,指向virtual函数列表的虚拟函数表,这样应该能够取到地址(实际上,这个virtual函数的printB最应该想到是直接崩溃,因为d指向NULL,即地址为0x00000000,再去找虚地址指针,肯定是不允许的)。
下面具体分析一下吧
先看一下类的成员函数的情况,
类A、B、C三个类,一个是什么都没有的真的空类,一个是有成员函数的类,最后一个是带有虚函数的类。
class A
{
};
class B{
public:
B(){}
~B