面试题答案
一键面试- 一般规则:
- 首先调用虚基类的构造函数,若虚基类有多个,按照它们在继承列表中出现的顺序依次调用。
- 然后调用非虚基类的构造函数,若有多个非虚基类,同样按照它们在继承列表中出现的顺序依次调用。
- 接着调用类自身的成员变量的构造函数,按照成员变量声明的顺序调用。
- 最后调用类自身的构造函数体。
- 示例代码:
#include <iostream>
class VirtualBase {
public:
VirtualBase() {
std::cout << "VirtualBase constructor called." << std::endl;
}
};
class Base1 : virtual public VirtualBase {
public:
Base1() {
std::cout << "Base1 constructor called." << std::endl;
}
};
class Base2 : virtual public VirtualBase {
public:
Base2() {
std::cout << "Base2 constructor called." << std::endl;
}
};
class Derived : public Base1, public Base2 {
public:
Derived() {
std::cout << "Derived constructor called." << std::endl;
}
};
int main() {
Derived d;
return 0;
}
在上述代码中,Derived
类继承自Base1
和Base2
,而Base1
和Base2
都虚继承自VirtualBase
。当创建Derived
类的对象d
时,构造函数的调用顺序为:
VirtualBase
构造函数被调用,因为它是虚基类。Base1
构造函数被调用,Base1
是非虚基类,在继承列表中先出现。Base2
构造函数被调用,Base2
是非虚基类,在继承列表中后出现。Derived
构造函数被调用。
运行上述代码,输出结果为:
VirtualBase constructor called.
Base1 constructor called.
Base2 constructor called.
Derived constructor called.