1. 程式人生 > >深入理解C++11【2】

深入理解C++11【2】

深入理解C++11【2】

1、繼承建構函式。

  當基類擁有多個建構函式的時候,子類不得不一一實現。

  C++98 可以使用 using 來使用基類的成員函式。

#include < iostream> using namespace std; 
struct Base { 
    void f( double i){ 
        cout << "Base:" << i << endl; 
    } 
}; 
struct Derived : Base { 
    using Base:: f; 
    
void f( int i) { cout << "Derived:" << i << endl; } }; int main() { Base b; b. f( 4. 5); // Base: 4. 5 Derived d; d. f( 4. 5); // Base: 4. 5 } // 編譯 選項: g++ 3- 1- 3. cpp

  C++11中,這個功能由成員函式擴充套件到了建構函式上。

struct A { 
    A( int i) {} 
    A( 
double d, int i) {} A( float f, int i, const char* c) {} // ... }; struct B : A { using A:: A; // 繼承 構造 函式 // ... virtual void ExtraInterface(){} };

  這 意味著 如果 一個 繼承 構造 函式 不被 相關 程式碼 使用, 編譯器 不 會為 其 產生 真正 的 函式 程式碼。

  對於 繼承 構造 函式 來講, 引數 的 預設值不會被繼承 的。 事實上, 預設值 會 導致 基 類 產生 多個 構造 函式 的 版本, 這些 函式 版本 都會 被 派生 類 繼承。

  如果 一旦 使用 了 繼承 構造 函式, 編譯器 就不 會 再為 派生 類 生成 預設 構造 函式 了,

struct A { A (int){} }; 
struct B : A{ using A:: A; }; 
B b; // B 沒有 預設 構造 函式

  截至2013年,還沒有編譯器實現了繼承建構函式。

 

2、委派建構函式。

 

3、

4、

5、

6、

7、