C++11継承構造関数
コンストラクション関数の継承バックグラウンド 派生クラスベースクラスの関数 を使用派生クラス継承親構造関数 注意事項 背景
ベースクラスには複数の異なるバージョンのコンストラクション関数があり、サブクラスはコンストラクション関数に対応して「透過」する必要があります.たとえば、次のようにします.
Derivedクラスはbaseクラスを継承し,コンストラクション関数はBaseクラスのコンストラクション関数パラメータを1つ1つ「透過」しなければならず,煩雑である.
派生クラスベースクラスを使用する関数
派生クラスはベースクラスの関数を使用して、
そのときに使う言葉
funで呼び出された関数は親関数です.印刷:
それ以外の場合は、次のように印刷されます.
派生クラス親構造関数の継承
派生クラスとベースクラス関数を使用する方法では、usingを使用して親クラスのコンストラクション関数
出力:
注意事項継承コンストラクション関数では、派生クラスデータメンバーを初期化できません.(解決策:1.その場でメンバーを初期化できます.2.コンストラクタを追加し、対応する親コンストラクタを追加します) コンストラクタデフォルト値を持つと複数のコンストラクタバージョンが生成され、継承コンストラクタはベースクラスコンストラクタのデフォルトパラメータ を継承できません.継承が多い場合、継承コンストラクション関数は、複数のベースクラスの一部のコンストラクション関数によって派生クラスの継承コンストラクション関数の関数名がパラメータと同じになる可能性があります.すなわち、関数署名(解決方法:定義継承コンストラクション関数の表示)は、 のようになります.
ベースクラスには複数の異なるバージョンのコンストラクション関数があり、サブクラスはコンストラクション関数に対応して「透過」する必要があります.たとえば、次のようにします.
class Base {
public:
Base(int i) { std::cout << "Base: Base(int)
"; }
Base(double d, int i) { std::cout << "Base: Base(double, int)
"; }
void fun(float d) { std::cout << "Base fun
"; }
// ......
};
class Derived : public Base {
public:
Derived(int i) : Base(i) { }
Derived(double d, int i) : Base(d, i) {}
void fun(int i) { std::cout << "Derived fun
"; }
// ......
};
Derivedクラスはbaseクラスを継承し,コンストラクション関数はBaseクラスのコンストラクション関数パラメータを1つ1つ「透過」しなければならず,煩雑である.
派生クラスベースクラスを使用する関数
派生クラスはベースクラスの関数を使用して、
using Base::fun;
を追加するなどusingで宣言できます.class Derived : public Base {
public:
using Base::fun;
Derived(int i) : Base(i) { }
Derived(double d, int i) : Base(d, i) {}
void fun(int i) { std::cout << "Derived fun
"; }
// ......
};
そのときに使う言葉
Derived d(2);
d.fun(2.3f);
funで呼び出された関数は親関数です.印刷:
Base fun
それ以外の場合は、次のように印刷されます.
Derived fun
派生クラス親構造関数の継承
派生クラスとベースクラス関数を使用する方法では、usingを使用して親クラスのコンストラクション関数
using Base::Base
を宣言できます.これにより、サブクラスコンストラクション関数の宣言を省略できます.class Base {
public:
Base(int i) { std::cout << "Base: Base(int)
"; }
Base(double d, int i) { std::cout << "Base: Base(double, int)
"; }
// ......
};
class Derived : public Base {
public:
using Base::Base;
// ......
};
int main() {
Derived d(2);
return 0;
}
出力:
Base: Base(int)
注意事項
class C : public A,public B
{
public:
using A::A;
using B::B; // , C(int)
// C(int)
C(int i):A(i),B(i){}
};