Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/EmptyTag/144.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么不使用范围解析运算符调用基类构造函数_C++ - Fatal编程技术网

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

C++ 为什么不使用范围解析运算符调用基类构造函数,c++,C++,在这里,我继承了一个类,并尝试使用范围解析运算符调用基类构造函数,但它显示了错误。甚至我们也可以使用相同的方法访问成员函数className::Fun()为什么不使用构造函数 class Base{ public: Base(){ cout << "A Constructor\n\n"; } }; class Derived:public Base{ public: Derived(){

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

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

cout您应该在成员初始值设定项列表中初始化基:

class Derived:public Base{
    public:
        Derived()
        :  Base()
        {}
};
但是,这个没有意义。您可以忽略它,因为它是Base的默认构造函数:

class Derived:public Base{
    public:
        Derived()
        {}
};
在您的示例中,您创建了一个未使用的临时基对象(但是,语法不正确)

具有:

#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;
}

您应该在成员初始值设定项列表中初始化基:

class Derived:public Base{
    public:
        Derived()
        :  Base()
        {}
};
但是,这个没有意义。您可以忽略它,因为它是Base的默认构造函数:

class Derived:public Base{
    public:
        Derived()
        {}
};
在您的示例中,您创建了一个未使用的临时基对象(但是,语法不正确)

具有:

#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;
}
以下代码:

    Derived(){
        Base::Base();
    }
在类的构造函数中构造一个临时的
Base
,并将其丢弃。行
Base::Base();
不会初始化
派生的
Base
部分

上述代码相当于:

    Derived() : Base() {
             // ^^^ This initializes the Base part of Derived.
        Base::Base();
    }
您需要的只是:

    Derived() {}
进一步阅读


以下代码:

    Derived(){
        Base::Base();
    }
在类的构造函数中构造一个临时的
Base
,并将其丢弃。行
Base::Base();
不会初始化
派生的
Base
部分

上述代码相当于:

    Derived() : Base() {
             // ^^^ This initializes the Base part of Derived.
        Base::Base();
    }
您需要的只是:

    Derived() {}
进一步阅读



不允许直接调用构造函数,这只是C++的工作方式。它必须在创建对象时被内部调用,或者通过放置new来调用。
调用
Base()时
本身没有限定符,您不是在调用构造函数,而是在创建一个临时对象。这显然是在调用构造函数,但对于临时对象,不是调用的对象。如果您在构造函数中输出对象的地址,您将看到它们不一样。

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

调用
Base()时
本身没有限定符,您不是在调用构造函数,而是在创建一个临时对象。这显然是在调用构造函数,但对于临时对象,不是调用的对象。如果您在构造函数中输出对象的地址,您将看到它们不一样。

基类构造函数是在您也可以手动调用它,但这样做只会创建基类的临时对象。@JerryCoffin我知道我的问题是关于这个
base::base()
这背后的逻辑是什么?在
派生的
的构造函数中调用时,它不再初始化继承的
,而是将其视为调用另一个对象的构造函数。非常奇怪的是,在C++14调用作用域解析冗余时会出现错误,但C++4.9.2在ne.我在标准中找不到关于作用域解析和构造函数的任何内容。基类构造函数是自动调用的。您也可以手动调用它,但这样做只会创建基类的临时对象。@JerryCoffin我知道我的问题是关于这个
base::base()
这背后的逻辑是什么?在
派生的
的构造函数中调用时,它不再初始化继承的
,而是将其视为调用另一个对象的构造函数。非常奇怪的是,在C++14调用作用域解析冗余时会出现错误,但C++4.9.2在ne.我在标准中找不到关于作用域解析和构造函数的任何内容。@R Sahu使用上一个代码,基构造函数仍然只调用一次。.应该调用两次,第一次是在创建派生类对象时,第二次是在派生构造函数初始化列表时。
derived():base()
execute,它也在调用基类的构造函数。@AsifMushtaq,
base::base()
只被调用一次,因为对象的创建是通过调用构造函数来完成的。@R Sahu您确定回答了我的最后一个问题吗?我想问的是,为什么基类构造函数没有在初始化列表中调用?
基类{public:Base(){cout@AsifMushtaq,Stop 1和步骤2实际上是一个步骤---调用
派生的构造函数来构造对象。@AsifMushtaq,为了更透彻地理解,最好阅读教程或教科书,更详细地解释对象构造和初始化的过程。@R Sahu with you最后一个代码,基构造函数仍然只调用一次。。它应该调用两次,第一次是在创建派生类对象时,第二次是在派生构造函数初始化列表时。
derived():base()
execute,它也在调用基类的构造函数。@AsifMushtaq,
base::base()
只被调用一次,因为对象的创建是通过调用构造函数来完成的。@R Sahu您确定回答了我的最后一个问题吗?我想问的是,为什么基类构造函数没有在初始化列表中调用?
基类{public:Base(){cout@AsifMushtaq,Stop 1和步骤2实际上是一个步骤---调用
派生的构造函数来构造对象。@AsifMushtaq,为了更透彻地理解,最好阅读一本教程或教科书,更详细地解释对象构造和初始化的过程。这可能是stupid问题,但我们可以使用相同的方法调用基类的成员函数。您对此有何看法?@AsifMushtaq构造函数是特殊的。哟