【发布时间】:2021-10-05 14:57:17
【问题描述】:
我有一个带有受保护构造函数的基类,因为不应直接实例化此类。
class Transform {
protected:
Transform();
~Transform() {}
public:
glm::vec3 some_member; // value will be initialized in the constructor
... // many other members
}
那我有很多派生类
class Camera : public Transform {
public:
Camera();
...
}
class Light: public Transform {
public:
Light();
...
}
我很惊讶派生构造函数中默认不调用基类构造函数,我以为它会被自动调用,结果证明是错误的。所以现在我想显式调用基类构造函数,以便正确初始化基类成员,所以我尝试了:
Camera::Camera() {
Transform::Transform(); // error C2248: cannot access protected member
__super::Transform(); // error C2248: cannot access protected member
}
基础构造函数是受保护的,不是私有的,为什么我不能在派生类中访问它?
神奇的是,我发现这很好用,但我不明白为什么,这里有什么区别?
Camera::Camera() : Transform() { // compile successfully
...
}
【问题讨论】:
-
这不是您从派生类的构造函数调用构造函数的方式,无论是否受保护。无需显式调用默认构造函数,但如果要显式调用默认构造函数,则需要在构造函数的初始化部分使用正确的语法。您的 C++ 教科书将包含更多信息和细节。
-
“惊讶的是,默认不调用基类构造函数” 被调用了。在这种情况下,您应该看不出有什么不同。 “我试过
Transform::Transform();” 如果没有protected,那将创建一个临时对象,与Transform();相同。 -
@HolyBlackCat 无论访问限定符如何,它总是默认调用吗?我确实看到了差异,看起来值在其他地方发生了变化......
-
“不管访问限定符如何,它总是默认调用” 是的。
-
@SamVarshavchik 我刚刚意识到默认情况下确实调用了基本构造函数,我的错。顺便说一句,在什么情况下我应该在初始化部分调用基本构造函数?
标签: c++