2012-11-19 148 views
5

如果我有一个基类:派生类构造函数调用

class Base{ 
    ... 
}; 

和派生类

class Derived : public Base{ 
    ... 
} 

这是否派生类总是调用基类的默认构造函数?即不带参数的构造函数?例如,如果我定义的基类的构造函数:

Base(int newValue); 

,但我不定义默认构造函数(无参数的构造函数):

Base(); 

(我承认这只是一个声明,而不是一个定义) 我得到一个错误,直到我定义了不带参数的默认构造函数。这是因为基类的默认构造函数是由派生类调用的构造函数吗?

+0

您可以通过使基类中的默认构造函数打印某些对屏幕唯一的东西来进行检查。这是检查这样的事情的好方法,你可以学习东西! –

回答

9

是的,默认情况下,调用默认构造函数。你可以去解决这个通过显式调用非默认的构造函数:

class Derived : public Base{ 
    Derived() : Base(5) {} 
}; 

这将调用基构造函数的参数,你不再需要声明在基类的默认构造函数。

1

默认构造函数被调用的原因是,如果您创建了任何对象,并且在该实例中未传递参数(您可能希望稍后在程序中初始化它们)。这是最普遍的情况,这就是为什么调用默认构造函数是必要的。

1

默认情况下,编译器提供了三种默认设置:

  1. 默认(无参数)构造函数

  2. 拷贝构造函数

  3. 赋值运算符

在情况下,如果你本人提供参数化的Ctor或Copy Ctor然后comp iler没有给出默认的Ctor,所以你明确地写了Default Ctor。

当我们创建一个Derived类对象时,它默认搜索Base的默认Ctor,如果我们没有提供它,那么编译器会抛出错误。但是我们可以让派生类Ctor调用我们指定的Base Ctor。

class Base { 
public: 
Base(int x){} 
}; 

class Derived { 
public: 
Derived():Base(5){}    //this will call Parameterized Base Ctor 
Derived(int x):Base(x){}  //this will call Parameterized Base Ctor 
} 
0

是的,默认情况下,调用默认构造函数。但如果你的基类已经paramterized构造函数,那么你可以调用非默认的构造函数有两种方式:

option 1: by explicitly calling a non-default constructor: 

class Derived : public Base{ 
Derived() : Base(5) {} 
}; 

选项2:

in base class constructor set the parameter default value to 0, so it will 
act as default as well as paramterized constructor both 

for example: 

class base 
{ public: 
base(int m_a =0){} 
}; 

class Derived 
{ public: 
Derived(){} 
}; 

上述方法将正常工作两个paramterized构造函数调用和默认构造函数调用。

相关问题