好吧,我有一个非常基本的问题,所以请放轻松我 在以下代码中:
#include<iostream>
class base
{
public:
base() { std::cout << "Base()" << std::endl; }
};
class derived: base {
public:
derived() { std::cout << "Derived()" << std::endl; }
};
int main() {
derived d;
}
输出结果为:
Base()
派生()
我想知道为什么即使我正在创建base
类的对象,也会调用derived
类的构造函数?我在FAQ
中找不到合适的答案。
答案 0 :(得分:7)
调用base
类的构造函数来初始化base
中包含的derived
类子对象。这就是继承的工作原理,这使得更容易遵循Liskov substitution principle。
请考虑以下事项:
class base
{
public:
base() : x(10) { std::cout << "Base()" << std::endl; }
private:
int x;
};
class derived: base {
public:
derived() { std::cout << "Derived()" << std::endl; }
};
如何在不调用基类的构造函数的情况下初始化成员base::x
?
然而,您应该注意,当您使用虚拟继承时,您应该手动调用公共库的构造函数。
答案 1 :(得分:5)
派生对象,根据定义,也是基础对象。
答案 2 :(得分:3)
应始终能够使用Derived
对象代替Base
对象。如果Base
具有需要为Base
正确初始化的私有成员才能工作,那么可能在构造函数中完成,因此应始终调用Base
构造函数。