下列代码执行后的输出顺序是( )。
class Base {
public:
Base() {
cout << "B ";
}
virtual ~Base() {
cout << "~B ";
}
};
class Derived : public Base {
public:
Derived() {
cout << "D ";
}
~Derived() {
cout << "~D ";
}
};
int main() {
Base *p = new Derived();
delete p;
return 0;
}构造函数按基类到派生类顺序执行,析构函数按派生类到基类顺序执行。看到题先想:new 时基类构造器先跑,delete 时派生类析构器先跑。
误以为析构顺序与构造相同(选 A);忽略基类构造器先执行(选 B);漏掉派生类析构器输出(选 D)。
本题考查《GESP 六级 C++ 面向对象编程》中"虚析构函数与对象生命周期"模块。命题人卡住的是考生对"构造顺序与析构顺序相反"这一核心规则的掌握,这是六级区分度最高的考点之一。
看到 new Derived() 先想:构造函数链式调用,基类构造器必在派生类构造器之前执行,输出顺序 B→D。
看到 delete p 先想:析构函数链式调用,派生类析构器必在基类析构器之前执行,输出顺序 ~D→~B。