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

C++ 在C+中调用基类构造函数+;,c++,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:

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

基类如下所示

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;
}
< P>是在C++中定义一个派生类构造函数的方法,如果是的,基类构造函数是如何调用的?

假设你是< /p>
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

的值,而不是
derived_class:dervied_class(…)
的语法错误(您缺少了一个额外的冒号),这看起来很好。从技术上讲,如果不显式执行,基类将使用默认构造函数初始化。没错
base\u class
在本例中没有默认构造函数:)我知道(并提到了这一点)。只是觉得应该在答案里。