深入理解C++11【2】
阿新 • • 發佈:2019-01-02
【深入理解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、