下面这段代码运行时会出现什么问题? class A { public: void f() { printf("A\n"); } }; class B: public A { public: virtual void f() { printf("B\n"); } }; int main() { A *a = new B; a->f(); delete a; return 0; } 没有问题,输出B 不符合预期的输出A 程序不正确 以上答案都不正确
class A { public: void f() { printf("A\n"); } }; class B: public A { public: virtual void f() { printf("B\n"); } }; int main() { A *a = new B; a->f(); delete a; return 0; }
确实会输出A,但同时程序也会崩溃。
因为delete a这一句会出错,a实际还是一个B类型,但是析构函数没有声明为虚函数,导致调用了A的默认析构函数,内存溢出了。