面试题答案
一键面试- 析构函数调用顺序:
- 当C的对象被销毁时,析构函数的调用顺序是先调用C的析构函数,然后调用B的析构函数,最后调用A的析构函数。这是因为在构造对象时,是从基类开始构造,先构造A,再构造B,最后构造C,析构时则相反。
- 不同继承方式下子类析构对父类析构调用的影响:
- public继承:public继承时,子类对象析构时会自动调用父类的析构函数。这是因为public继承保持了基类成员的访问属性,在析构子类对象时,按照对象构造的逆序依次调用各层父类的析构函数,与继承方式无关,都是正常调用。
- private继承:private继承时,虽然子类对象析构时同样会自动调用父类的析构函数,但是基类的成员在子类中变为private属性。不过这并不影响析构函数的调用顺序和机制,依然是先析构子类,再依次析构各层父类。
- protected继承:protected继承时,子类对象析构同样会自动调用父类的析构函数。基类的public成员在子类中变为protected,这也不影响析构函数的正常调用顺序。
- 验证代码:
#include <iostream>
class A {
public:
~A() {
std::cout << "A's destructor" << std::endl;
}
};
class B : public A {
public:
~B() {
std::cout << "B's destructor" << std::endl;
}
};
class C : public B {
public:
~C() {
std::cout << "C's destructor" << std::endl;
}
};
int main() {
C c;
return 0;
}
上述代码中,通过public继承方式展示了析构函数的调用顺序。如果要验证private和protected继承,只需要将class B : public A
中的public
改为private
或protected
即可,观察输出结果,析构函数调用顺序不变。输出结果如下:
C's destructor
B's destructor
A's destructor