看下面程序有什么问题?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | class X { public: X() { h(); } virtual ~X() {} virtual void f() = 0; void h(); }; void X::h() { f(); } void X::f() { } class Y : public X { public: Y() { } void f() { return ; } }; int main() { Y y; return 0; } |
这个呢?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | class X { public: X() { } virtual ~X() {} virtual void f() = 0; }; class Y : public X { public: Y() { } void f() { return ; } }; int main() { X *x = new Y; x->~X(); x->f(); return 0; } |
这两个程序的输出均是:
pure virtual method called terminate called without an active exception Aborted (core dumped)
原因和父类/子类的构造、析构的顺序,以及vtbl的相应变化有关,有兴趣的同学可以研究下。
注:纯虚函数在纯虚类的vtbl中的对应表项为函数__cxa_pure_virtual(),该函数会调用terminate(),后者打印”pure virtual method called”信息后调用abort自杀。