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

Calling Base Class Constructors in C++

本文关键字:基类 构造函数 调用 C++      更新时间:2023-10-16

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

基类如下所示

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++是否合法,如果是,如何调用基类构造函数?

假设你的意思

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

那么是的。这不仅是一种合法的方式,而且是为当前对象显式调用基构造函数的唯一方法。

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

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

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

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

。其中c(z)将您的int c初始化为 z 的值。

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