完美一道试题

看论坛上有人问了完美的一道题,挺有意思:

class classA 
{   
public:   
     classA()   
     {   
         clear();   
     }   
     virtual ~classA()   
     {   
     }   
     void clear()   
     {   
         memset(this , 0 , sizeof(*this));   
     }   
     virtual void func()   
     {   
         printf("func
");   
     }   
};   
class classB : public classA   
{   
};   
    
int main(void)   
{   
     classA oa;   
     classB ob;   
     classA * pa0 = &oa;   
     classA * pa1 = &ob;   
     classB * pb = &ob;   
    
     oa.func();         // 1   
     ob.func();         // 2   
     pa0->func();       // 3   
     pa1->func();       // 4   
     pb->func();        // 5   
    
     return 0;   
}   

函数执行结果:

func          func        执行出错          func          func 

试解释原因。

1 2 对,因为不会引发虚函数动态绑定, 3不对因为oa里面的虚指针为NULL, 4 5 对因为ob 里面的虚指针是对的,因为先构造基类,后构造派生类,构造派生类的时候初始化虚指针。 

原文地址:https://www.cnblogs.com/theCambrian/p/3392093.html