如果我有基类。
class Base{
...
};
和派生类
class Derived : public Base{
...
}
如果仅包含基类,可以从main()类调用派生类构造函数吗?
澄清我的意思。我可以这样做吗?
#include "Base.h"
int main(){
Derived d;
}
注意:我唯一能找到的答案是是否可以从Derived类调用Base构造函数,但我想做相反的事情。
我仅包含“ Base.h”。我是否必须包括“ Derived.h”才能调用构造函数?如果我在一个超类下有150个子类怎么办?我必须包括每个人吗?
答案 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
}
如果您根本不包含任何构造函数,那么编译器将为您添加一个(基本上将所有变量设置为编译器的默认值。
这些发生的顺序是
此外,在包含时,必须包含要在main中引用的所有对象。
答案 4 :(得分:0)
问题中存在许多误解:
您从不“调用构造函数”。执行此操作的语法不存在。您试图做的是声明,定义,实例化,创建类型为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()
的对象。
您尝试从Derived
,而不是从基类开始。
main()
是一个函数,而不是一个类。
否,没有main()
的定义就无法创建。它的基础在范围内是不够的,即使不是,编译器也无法知道基础在范围内,因为它不知道Derived
是什么。
答案 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
的定义(这是常规的),则否。