为什么不使用范围解析运算符调用基类构造函数

时间:2015-06-08 17:56:12

标签: c++

这里我继承了一个类,并尝试使用范围解析运算符调用基类构造函数,但它显示错误。即使我们可以使用相同的方法className::Fun();访问成员函数,为什么不使用构造函数?

class Base{
    public:
        Base(){
            cout << "A Constructor\n\n";
        }
};
class Derived:public Base{
    public:
        Derived(){
            Base::Base();
        }
};

我知道我可以通过Base();调用基础构造函数 但Base::Base();背后的逻辑是什么,不允许这样做。

我总是担心发布可能重复的问题,但是在找不到答案后我发布了,如果我仍然发布重复的问题请帮助我如何搜索我的问题是否可以在stackoverflow上找到。

3 个答案:

答案 0 :(得分:3)

以下代码:

    Derived(){
        Base::Base();
    }

在类的构造函数中构造一个临时的Base并将其丢弃。第Base::Base();行未初始化Base的{​​{1}}部分。

以上代码相当于:

Derived

你需要的只是:

    Derived() : Base() {
             // ^^^ This initializes the Base part of Derived.
        Base::Base();
    }

进一步阅读

Constructors and member initializer lists
Understanding class object construction

答案 1 :(得分:1)

您应该在成员初始化列表中初始化Base:

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

然而,这一点毫无意义。您可以省略它,因为它是Base的默认构造函数:

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

在您的示例中,您将创建一个未使用的临时Base对象(但是,语法不正确)。

有:

#include <iostream>

class Base{
    public:
        Base(){
            std::cout << "A Constructor\n\n";
        }
};

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

int main() {
    Derived d;
    return 0;
}

产地:

A Constructor

A Constructor

答案 2 :(得分:1)

您不能直接调用构造函数,这只是C ++的工作原理。必须在创建对象时通过内部调用它,或者通过放置new来调用它。

当您在没有限定符的情况下单独调用Base()时,您没有调用构造函数,而是创建了一个临时对象。这显然会调用构造函数,但对于临时对象,而不是执行调用的对象。如果你在构造函数中输出对象的地址,你会发现它们不一样。

相关问题