C++親クラスを呼び出すコンストラクション関数規則
3769 ワード
コンストラクションメソッドは、親の他のメンバーとは異なり、クラスに継承されないクラスのオブジェクトを初期化するために使用されます(子クラスは親のすべてのメンバー変数とメンバーメソッドを継承できますが、親のコンストラクションメソッドは継承されません).したがって、サブクラスオブジェクトを作成するときに、親から継承されたデータメンバーを初期化するには、その親の構築方法を呼び出す必要があります.
明示的なコンストラクション関数がない場合、コンパイラはデフォルトのコンストラクション関数を与え、デフォルトのコンストラクション関数は明示的にコンストラクション関数を宣言しない場合にのみ作成されます.
構造原則は以下の通りである:1.子クラスにコンストラクションメソッドが定義されていない場合は、親クラスのパラメータなしコンストラクションメソッドが呼び出されます.
2.子クラスが構築方法を定義した場合、パラメータなしでもパラメータ付きでも、子クラスのオブジェクトを作成するときは、まず親クラスのパラメータなしの構築方法を実行し、その後、独自の構築方法を実行します.
3.サブクラスオブジェクトを作成するときに、サブクラスのコンストラクタに親を呼び出すコンストラクタが表示されない場合、親のデフォルトの非パラメトリックコンストラクタが呼び出されます.
4.サブクラスオブジェクトを作成するときに、サブクラスのコンストラクション関数に呼び出した親のコンストラクション関数が表示されず、親自身が非パラメトリックコンストラクション関数を提供している場合は、親自身の非パラメトリックコンストラクション関数が呼び出されます.
5.サブクラスオブジェクトを作成するときに、サブクラスのコンストラクション関数に呼び出した親のコンストラクション関数が表示されず、親が独自のパラメトリックコンストラクション関数のみを定義している場合はエラーが発生します(親がパラメータ付きコンストラクションメソッドしかない場合は、このパラメトリックコンストラクションメソッドの呼び出しを表示する必要があります).
6.子クラスが親クラスのパラメータ付き構造方法を呼び出す場合は、リストを初期化する方法が必要です.
結論:サブクラスコンストラクション関数は親クラスのコンストラクション関数(明示的であれ暗黙的であれ)を呼び出さなければならない.本質的な原因は継承の性質が親がいなければならないことを決定したからだ.
一例を見てみましょう.new A 1を実行するとき、次のコードの出力は何ですか.
参照先:
http://www.cnblogs.com/sunada2005/p/3396585.html
http://blog.csdn.net/scottly1/article/details/25594439
明示的なコンストラクション関数がない場合、コンパイラはデフォルトのコンストラクション関数を与え、デフォルトのコンストラクション関数は明示的にコンストラクション関数を宣言しない場合にのみ作成されます.
構造原則は以下の通りである:1.子クラスにコンストラクションメソッドが定義されていない場合は、親クラスのパラメータなしコンストラクションメソッドが呼び出されます.
2.子クラスが構築方法を定義した場合、パラメータなしでもパラメータ付きでも、子クラスのオブジェクトを作成するときは、まず親クラスのパラメータなしの構築方法を実行し、その後、独自の構築方法を実行します.
3.サブクラスオブジェクトを作成するときに、サブクラスのコンストラクタに親を呼び出すコンストラクタが表示されない場合、親のデフォルトの非パラメトリックコンストラクタが呼び出されます.
4.サブクラスオブジェクトを作成するときに、サブクラスのコンストラクション関数に呼び出した親のコンストラクション関数が表示されず、親自身が非パラメトリックコンストラクション関数を提供している場合は、親自身の非パラメトリックコンストラクション関数が呼び出されます.
5.サブクラスオブジェクトを作成するときに、サブクラスのコンストラクション関数に呼び出した親のコンストラクション関数が表示されず、親が独自のパラメトリックコンストラクション関数のみを定義している場合はエラーが発生します(親がパラメータ付きコンストラクションメソッドしかない場合は、このパラメトリックコンストラクションメソッドの呼び出しを表示する必要があります).
6.子クラスが親クラスのパラメータ付き構造方法を呼び出す場合は、リストを初期化する方法が必要です.
結論:サブクラスコンストラクション関数は親クラスのコンストラクション関数(明示的であれ暗黙的であれ)を呼び出さなければならない.本質的な原因は継承の性質が親がいなければならないことを決定したからだ.
一例を見てみましょう.new A 1を実行するとき、次のコードの出力は何ですか.
#include
using namespace std;
int init(const std::string & info)
{
std::cout << info << std::endl;
return 0;
}
class A
{
int m_x;
public:
A():m_x(init("Init A::m_x"))
{
init("Call A::A()");
}
};
class A1:public A
{
int m_x;
int m_y;
public:
A1(): m_y(init("Init A1::m_y")), m_x(init("Init A1::m_x"))
{
init("Call A1::A1()");
}
};
:
Init A::m_x
Call A::A() ==>
Init A1::m_x ==> “ ”
Init A1::m_y
Call A1::A1()
参照先:
http://www.cnblogs.com/sunada2005/p/3396585.html
http://blog.csdn.net/scottly1/article/details/25594439