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

时间:2018-12-22 18:24:03

标签: c++

如果我有基类。

class Base{
   ...
};

和派生类

class Derived : public Base{
   ...
}

如果仅包含基类,可以从main()类调用派生类构造函数吗?

澄清我的意思。我可以这样做吗?

#include "Base.h"

int main(){
  Derived d;
}

注意:我唯一能找到的答案是是否可以从Derived类调用Base构造函数,但我想做相反的事情。

我仅包含“ Base.h”。我是否必须包括“ Derived.h”才能调用构造函数?如果我在一个超类下有150个子类怎么办?我必须包括每个人吗?

6 个答案:

答案 0 :(得分:4)

您不能从基类调用派生类的构造函数。基类不知道,派生类甚至存在。

答案 1 :(得分:1)

构造函数有适当的初始化对象的特殊工作。派生类构造函数只能访问其自己的类成员,但是派生类对象也具有基类的继承属性,并且只有基类构造函数才能正确初始化基类成员。因此所有的构造函数都会被调用,否则对象将无法正确构造。

https://www.studytonight.com/cpp/order-of-constructor-call.php

每当派生类的默认构造函数被调用时,基类的默认构造函数就会被自动调用。每当派生类继承基类的构造函数不能以任何方式(公共,私有,受保护)继承时

答案 2 :(得分:0)

您的派生类应包含Base.h,因为它是编译所必需的。然后,您可以在主文件中包括Derived。

答案 3 :(得分:0)

构造派生对象时,它会自动调用基本的默认构造函数。如果您不希望它调用基本的默认构造函数而调用非默认的构造函数,则可以执行以下操作:

Derived::Derived() : Base(/*Parameters to call base non-default constructor here*/)
{
    //Do stuff specifically for the derived class
}

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

这些发生的顺序是

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

此外,在包含时,必须包含要在main中引用的所有对象。

答案 4 :(得分:0)

问题中存在许多误解:

  1. 从不“调用构造函数”。执行此操作的语法不存在。您试图做的是声明,定义,实例化,创建类型为def main(): ### load up student's classifier, dataset, and feature_list clf, dataset, feature_list = load_classifier_and_data() ### Run testing script test_classifier(clf, dataset, feature_list) if __name__ == '__main__': main() 的对象。

  2. 您尝试从Derived,而不是从基类开始。

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

  4. 否,没有main()的定义就无法创建。它的基础在范围内是不够的,即使不是,编译器也无法知道基础在范围内,因为它不知道Derived是什么。

    < / li>

答案 5 :(得分:0)

  

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

如果您的意思是“我可以在基类的成员函数中创建派生类实例” ,那么可以。一个例子:

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的定义(这是常规的),则否。