我喜欢在C ++中将我的类声明和定义分开。因此,在标题中我可以定义一个' base'课程如下:
# Base.h
class Base
{
int n;
public:
Base(int x);
};
并在cpp文件中定义其构造函数实现,即
# Base.c
Base::Base(int x)
{
n = x;
}
现在,如果我定义了一个'派生的'继承' base' class,我可以将参数传递给基类,如下所示:
#Derived.h
class Derived : public Base
{
int t;
public:
Derived(int y) : Base(t) {t = y;}
}
但是这样做需要我将Derived类的构造函数的主体放在头文件中,即{t = y;}
,因此构造函数定义不再与其声明分开。有没有办法将参数传递给类的基类构造函数,仍然允许我在cpp文件中定义派生类的构造函数?
答案 0 :(得分:5)
是的,在头文件中:
class Derived : public Base
{
int t;
public:
Derived(int y); // Declaration of constructor
};
在cpp文件中:
Derived::Derived(int y) : Base(t) { // Definition of constructor
t = y;
}
Member initializer lists在类构造函数的定义以及内联类内定义中是允许的。如果您感兴趣,我还建议您查看cppreference有关初始化顺序的两个小注意事项,以及在执行复合构造函数体之前初始化成员的事实。
答案 1 :(得分:4)
有没有办法将参数传递给类的基类构造函数,仍然允许我在cpp文件中定义派生类的构造函数?
当然有。标题只能声明构造函数,就像您对Base
所做的那样:
class Derived : public Base
{
int t;
public:
Derived(int y);
};
然后您可以在源文件中实现它,就像您对Base
所做的那样:
Derived::Derived(int y) : Base(y), t(y) {}
请注意,您必须将参数y
,而不是(尚未初始化的)成员t
传递给基础构造函数。基础子对象始终在成员之前初始化。