[英]Can I call a derived class constructor from a base class?
如果我有基础课。
class Base{
...
};
和派生类
class Derived : public Base{
...
}
如果仅包含基类,可以从main()类调用派生类构造函数吗?
为了澄清我的意思。 我可以这样做吗?
#include "Base.h"
int main(){
Derived d;
}
注意:我唯一能找到的答案是是否可以从Derived类调用Base构造函数,但我想做相反的事情。
我只包含“ Base.h”。 我是否必须包括“ Derived.h”才能调用构造函数? 如果我在一个超类下有150个子类怎么办? 我必须包括每个人吗?
您不能从基类调用派生类构造函数。 基类不知道派生类是否存在。
构造函数具有正确初始化对象的特殊工作。 派生类构造函数只能访问其自己的类成员,但是派生类对象也具有基类的继承属性,并且只有基类构造函数才能正确初始化基类成员。 因此所有的构造函数都会被调用,否则对象将无法正确构造。
https://www.studytonight.com/cpp/order-of-constructor-call.php
每当派生类的默认构造函数被调用时,基类的默认构造函数就会被自动调用。每当派生类继承基类的构造函数都不能以任何模式(public,private,protected)被继承时。
您的派生类应包含Base.h,因为它是编译所必需的。 然后,您可以在主文件中包括Derived。
构造派生对象时,它将自动调用基本默认构造函数。 如果您不希望它调用基本的默认构造函数而调用非默认的构造函数,则可以执行以下操作:
Derived::Derived() : Base(/*Parameters to call base non-default constructor here*/)
{
//Do stuff specifically for the derived class
}
如果根本不包含任何构造函数,则编译器将为您添加一个(基本上将所有变量设置为编译器的默认值。
这些发生的顺序是
同样,对于include,必须包含将要在main中引用的任何对象。
问题中存在许多误解:
您永远不会 “调用构造函数”。 执行此操作的语法不存在。 您试图做的是声明,定义,实例化,创建Derived
类型的对象。
您尝试从main()
而不是从基类执行此操作。
main()
是一个函数,而不是一个类。
不,没有它的定义就无法创建“ Derived
。 它的基础在范围内是不够的,即使不是,编译器也无法知道基础在范围内,因为它不知道什么是Derived
。
我可以从基类调用派生类构造函数吗?
如果您的意思是“我可以在基类的成员函数中创建派生类实例” ,那么可以。 一个例子:
struct Base {
void foo();
};
struct Derived {
Derived() {
// a constructor
}
};
void Base::foo() {
Derived d; // "calling the constructor" of derived class
}
究竟什么时候有用? 可能永远不会。
如果仅包含基类,可以从主类调用派生类构造函数吗?
不。您只能创建已定义的类的实例(我想这就是您所谓的“调用构造函数”的意思)。 如果不包括定义,则无法创建实例。
我是否必须包括“ Derived.h”才能调用构造函数?
如果那是定义类的地方,那么可以。 必须先定义该类,然后才能实例化它。
如果我在一个超类下有150个子类怎么办? 我必须包括每个人吗?
如果要实例化150个类的对象,则是的,必须首先定义所有150个类。 但是,我怀疑这不是您需要做的。
为了澄清我的意思。 我可以这样做吗?
#include "Base.h" int main(){ Derived d; }
取决于"Base.h"
包含的内容。 如果它包含Derived
类的定义(这是非常规的),则为是。 如果它不包含“ Derived
的定义(这是常规的),则否。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.