这里我继承了一个类,并尝试使用范围解析运算符调用基类构造函数,但它显示错误。即使我们可以使用相同的方法className::Fun();
访问成员函数,为什么不使用构造函数?
class Base{
public:
Base(){
cout << "A Constructor\n\n";
}
};
class Derived:public Base{
public:
Derived(){
Base::Base();
}
};
我知道我可以通过Base();
调用基础构造函数
但Base::Base();
背后的逻辑是什么,不允许这样做。
我总是担心发布可能重复的问题,但是在找不到答案后我发布了,如果我仍然发布重复的问题请帮助我如何搜索我的问题是否可以在stackoverflow上找到。
答案 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()
时,您没有调用构造函数,而是创建了一个临时对象。这显然会调用构造函数,但对于临时对象,而不是执行调用的对象。如果你在构造函数中输出对象的地址,你会发现它们不一样。