完美一道试题
看论坛上有人问了完美的一道题,挺有意思:
class classA { public: classA() { clear(); } virtual ~classA() { } void clear() { memset(this , 0 , sizeof(*this)); } virtual void func() { printf("func\n"); } }; 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 里面的虚指针是对的,因为先构造基类,后构造派生类,构造派生类的时候初始化虚指针。
posted on 2013-10-28 11:34 theCambrian.cpp 阅读(187) 评论(0) 编辑 收藏 举报