繁体   English   中英

我可以从基类调用派生类构造函数吗?

[英]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
}

如果根本不包含任何构造函数,则编译器将为您添加一个(基本上将所有变量设置为编译器的默认值。

这些发生的顺序是

  1. 基本构造函数(如果您如上所述指定,则为非默认值)
  2. 派生构造函数

同样,对于include,必须包含将要在main中引用的任何对象。

问题中存在许多误解:

  1. 永远不会 “调用构造函数”。 执行此操作的语法不存在。 您试图做的是声明,定义,实例化,创建Derived类型的对象。

  2. 您尝试从main()而不是从基类执行此操作。

  3. main()是一个函数,而不是一个类。

  4. 不,没有它的定义就无法创建“ 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM