3

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

基类如下

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++ 中定义派生类构造函数的方式是否合法,如果是,如何调用基类构造函数?

4

3 回答 3

6

假设你的意思

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

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

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

于 2012-11-28T19:35:18.460 回答
3

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

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

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

...在哪里将您的值c(z)初始化为.int cz

于 2012-11-28T19:36:41.653 回答
0

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

于 2012-11-28T19:35:35.583 回答