在C ++中调用基类构造函数

时间:2012-11-28 19:33:10

标签: c++

这是调用基类构造函数的合法方法吗。

基类如下

class base_class
{
    public:
    base_class(int x, int y);    
    protected:
    int a;
    int b;
};

base_class::base_class(int x,int y)
{
    a=x;
    b=y;
}

派生类是以下

class derived_class: public base_class
{
    public:
    derived_class(int x,int y,int z);
    protected:
    int c;
};
derived_class:: derived_class(int x,int y,int z):base_class(x,y)  /*Edited and included the scope resolution operator*/
{
    c=z;
}

这种在C ++中定义派生类构造函数的方法是否合法,如果是,如何调用基类构造函数?

3 个答案:

答案 0 :(得分:6)

假设你的意思

derived_class::derived_class(int x,int y,int z):base_class(x,y)   
//            |
//     scope resolution operator

然后是的。它不仅仅是 合法的方式,它只是 显式调用当前对象的基础构造函数的唯一方法。

除非您这样做,否则将隐式调用默认构造函数。在您的情况下,基类没有默认构造函数,因此您将收到编译器错误。

答案 1 :(得分:3)

如果您正在调用非默认构造函数,这是初始化基类的正确(且唯一)方法 - 当然,如果您将第二个冒号添加到范围解析运算符中。

更常见的是在“初始化列表”(冒号和函数体之间的部分)中初始化所有成员,如下所示:

derived_class::derived_class(int x,int y,int z):
    base_class(x, y),
    c(z)
{
}

... c(z)int c初始化为z的值。

答案 2 :(得分:0)

是的,这是正确的方式,实际上是在派生类之前调用​​基类构造函数的唯一方法。