为什么要调用基础构造函数?

时间:2011-04-10 18:19:43

标签: c++ visual-c++ c++11

好吧,我有一个非常基本的问题,所以请放轻松我 在以下代码中:

#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中找不到合适的答案。

3 个答案:

答案 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构造函数。