C 11 FAQ中文版 繼承的建構函式

2021-06-06 04:29:28 字數 1020 閱讀 4405

三2

year 2011

陳 良喬

c++11 faq

繼承的建構函式

人們有時會對類成員函式或成員變數的作用域問題感到困惑,尤其是,當基類與派生類的同名成員不在同乙個作用域內時:

struct b ;

struct d : b ;

b b; b.f(4.5); // 可行

// 呼叫的到底是b::f(doube)還是d::f(int)呢?

// 實際情況往往會讓冉感到意外:呼叫的f(int)函式實參為4

d d; d.f(4.5);

在c++98標準裡,可以將普通的過載函式從基類「晉級」到派生類裡來解決這個問題:

struct b ;

struct d : b ;

b b; b.f(4.5); // 可行

// 可行:呼叫類d中的f(double)函式

// 也即類b中的f(double)函式

d d; d.f(4.5);

普通過載函式可以通過這種方式解決,那麼,對於建構函式又該怎麼辦呢? 我已經說過「不能像應用於普通成員函式那樣,將上述語法應用於建構函式,這如歷史偶然一樣」。為了解決建構函式的「晉級」問題,c++11提供了這種能力:

class derived : public base ;
如果這樣用了,仍然可能困惑於派生類中繼承的建構函式,這個派生類中定義的新成員變數需要初始化(譯註:基類並不知道派生類的新增成員變數,當然不會對其進行初始化。):

struct b1 

};struct d1 : b1 ;

void test()

我們可以通過使用成員初始化(member-initializer)消除以上的困惑:

struct d1 : b1 ;

};void test()

或參見:

C 11 FAQ中文版 返回值型別後置語法

二28 year 2011 陳 良喬 c 11 faq 返回型別後置語法 考慮下面這段 template?mul t x,u y 函式mul 的返回型別要怎麼寫呢?當然,是 x y型別 但是這並不是乙個資料型別,我們如何才能一開始就得到它的真實資料型別呢?在初步了解c 0x之後,你可能一開始想到使用...

C 11 FAQ中文版 類成員的內部初始化

三1 year 2011 陳 良喬 c 11 faq 類內部成員的初始化 在c 98標準裡,只有static const宣告的整型成員能在類內部初始化,並且初始化值必須是常量表示式。這些限制確保了初始化操作可以在編譯時期進行。例如 int var 7 class x c 11的基本思想是,允許非靜態...

C 11 FAQ中文版 類成員的內部初始化

三1 year 2011 陳 良喬 c 11 faq 類內部成員的初始化 在c 98標準裡,只有static const宣告的整型成員能在類內部初始化,並且初始化值必須是常量表示式。這些限制確保了初始化操作可以在編譯時期進行。例如 int var 7 class x c 11的基本思想是,允許非靜態...