我如何调用基类的构造函数?
我花了很多Java编程。 在那里你调用你从super();
inheritance的类super();
(你们大概都知道)
现在我有一个C ++类,它有一个默认的构造函数,它需要一些参数。 例:
class BaseClass { public: BaseClass(char *name); ....
如果我inheritance这个类,它给了我警告,没有适当的默认构造函数可用。 那么在C ++中是否有像super()
这样的东西,还是我必须定义一个函数来初始化所有variables?
您可以在子类的构造函数的初始化程序列表中执行此操作。
class Foo : public BaseClass { public: Foo() : BaseClass("asdf") {} };
带有参数的基类构造函数必须在任何成员初始化之前调用。
在头文件中定义一个基类:
class BaseClass { public: BaseClass(params); };
然后将派生类定义为inheritanceBaseClass:
class DerivedClass : public BaseClass { public: DerivedClass(params); };
在源文件中定义BaseClass构造函数:
BaseClass::BaseClass(params) { //Perform BaseClass initialization }
默认情况下,派生构造函数只调用没有参数的默认基类构造函数; 所以在这个例子中,当调用派生构造函数时不会自动调用基类构造函数,但可以通过在冒号(:)后面添加基类构造函数语法来实现。 定义一个自动调用其基础构造函数的派生构造函数:
DerivedClass::DerivedClass(params) : BaseClass(params) { //This occurs AFTER BaseClass(params) is called first and can //perform additional initialization for the derived class }
BaseClass
构造函数在DerivedClass
构造函数之前DerivedClass
,如果需要,可以将相同/不同的参数params
传递给基类。 这可以嵌套到更深的派生类。 派生的构造函数必须调用EXACTLY ONE基础构造函数。 析构函数是AUTOMATICALLY调用构造函数被调用的REVERSE顺序。
编辑:如果您从任何virtual
类inheritance,通常要实现多重inheritance或钻石inheritance有此规则的例外。 那么你必须明确地调用所有virtual
基类的基础构造函数,并明确地传递参数,否则将只调用它们的默认构造函数而不带任何参数。 请参阅: 虚拟inheritance – 跳过构造函数
你必须使用启动器:
class DerivedClass : public BaseClass { public: DerivedClass() : BaseClass(<insert arguments here>) { } };
这也是你如何构build你的类没有构造函数(或者你想要初始化)的成员。 任何未提及的成员将被默认初始化。 例如:
class DerivedClass : public BaseClass { public: DerivedClass() : BaseClass(<insert arguments here>) , nc(<insert arguments here>) //di will be default initialized. { } private: NeedsConstructor nc; CanBeDefaultInit di; };
成员指定的顺序是不相关的(虽然构造函数必须先来),但是它们将被构造的顺序是以声明顺序。 所以nc
总是会在di
之前被构造的。
关于超级的select; 在大多数情况下,您可以在派生类的初始化列表中使用基类,或者在其他地方进行工作时使用Base::someData
语法,派生类重新定义数据成员。
struct Base { Base(char* name) { } virtual ~Base(); int d; }; struct Derived : Base { Derived() : Base("someString") { } int d; void foo() { d = Base::d; } };
在C ++中没有super()。 您必须明确地通过名称调用基础构造函数。
在初始化程序列表中使用基类的名称。 初始化程序列表出现在方法主体之前的构造函数签名之后,可用于初始化基类和成员。
class Base { public: Base(char* name) { // ... } }; class Derived : Base { public: Derived() : Base("hello") { // ... } };
或者,一些人使用的模式是自己定义“超级”或“基础”。 也许一些赞成这种技术的人是转向C ++的Java开发人员。
class Derived : Base { public: typedef Base super; Derived() : super("hello") { // ... } };