2014-10-29 171 views
1

我喜欢将我的类声明和定义在C++中分开。所以,在头我可如下定义“基地”类:将参数传递给基类构造函数C++

# Base.h 
class Base 
{ 
    int n;  
public: 
    Base(int x); 
}; 

,并在CPP文件中定义它的构造函数实现,即

# Base.c 
Base::Base(int x) 
{ 
    n = x; 
} 

现在,如果我定义了一个“衍生“类继承了‘基地’课,我可以传递参数给基类如下:

#Derived.h 
class Derived : public Base 
{ 
    int t; 
public: 
    Derived(int y) : Base(t) {t = y;} 
} 

但是做这种方式要求我把构造体派生类在头文件,即{t = y;},因此构造函数定义不再与其声明分开。有没有办法将参数传递给一个类的基类构造函数,它仍然使我能够在cpp文件中为派生类定义构造函数?

回答

3

是有,在头文件:

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关于初始化顺序和成员将在复合构造函数体执行之前被初始化的两个小警告。

3

有没有办法将参数传递给类的基类构造函数,它仍然使我能够在cpp文件中为派生类定义构造函数?

当然有。头可以只声明构造,完全按照你为Base

class Derived : public Base 
{ 
    int t; 
public: 
    Derived(int y); 
}; 

,那么你可以实现在源文件中,正是因为你为Base

Derived::Derived(int y) : Base(y), t(y) {} 

注意,你”必须将参数y,而不是(尚未初始化的)成员t传递给基础构造函数。基础子对象始终在成员之前初始化。

+0

当然,简单;-) – 2014-10-29 10:53:58

相关问题