2014-10-29 155 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

相關問題