派生クラス(derived class)は基底クラス(base class) から派生クラスのコンストラクターは、基底クラスの要素の初期化のために基底クラスのコンストラクターを自動的に呼び出す。そのとき、派生クラスのコンストラクタの初期化リストが
- データメンバーとメンバ関数はすべて継承する。
- コンストラクタ、コントラクタ、代入演算子は継承されない。
- 基底クラスの仮想関数はオーバライドできる。
基底クラスの型を持つポインター変数(pb)に派生クラスへのポインターを代入できる。注意することは、
- ある場合
初期化リスト(の引数の指定)に従って基底クラスのコンストラクターを呼び出す
- 無い場合
基底クラスの引数無しコンンストラクタを呼び出す。
引数無しコンストラクタがない場合は、エラー。
delete pb;
を実行したとき、基底クラスのデストラクタがvirtual のときは派生クラスのデストラクタが、 virtual で無いときは、基底クラスのデストラクタが
呼び出されることである。
同じ名前のメンバー関数は、シグネチャー(引数の数)が異なっていても、派生クラス型の変数を用いて
基底クラスの関数を呼び出すことはできない。スコープ解決演算子 :: を用いると、派生クラスから基底クラスの関数を明示的に呼び出すことができる。
呼び出し順序:
コンストラクタ:
デストラクタ:
- 基底クラスのコンストラクタの呼び出し。
- 派生クラスのデータメンバーのコンストラクターの呼び出し。
- 派生クラスのコンストラクタの呼び出し。
仮想関数:
- 派生クラスのデストラクターの呼び出し。
- 派生クラスオブジェクトのデータメンバーのデストラクタの呼び出し
- 基底クラスのデストラクターの呼び出し
仮想関数の呼び出し元と呼び出される関数本体の結合は実行時に行われる。
仮想関数(基底クラスで virtual と指定された関数)が派生クラスで、
仮想基底クラス:
- 再定義されると、派生クラスの関数が呼び出される。
- 再定義されていないと、(派生クラス型の変数からでも)基底クラスの関数が呼び出される。
多重継承で派生クラスを定義したときに、基底クラスとして複数個同じクラスが含まれていても、1つのオブジェクトしか
生成されないクラス。派生したクラスには、同じ基底クラスについて仮想基底クラスのインスタンスと非仮想基底クラスのインスタンスを両方持つことができる。(インスタンス=クラスから生成されたオブジェクト)
コンストラクター:
- 非仮想基底クラスのコンストラクターの前に呼び出される。
- 複数の仮想基底クラスがある場合には、派生クラスからの深さ優先で指定された順番(左優先)に呼び出される。
- 仮想基底クラスのコンストラクターは一度しか呼び出されない。
クラスメンバーの参照は、通常 private メンバーの場合はそれ自身から、 protected メンバーの場合は
それ自身および派生したクラスからしか参照が許されない。しかし、関数やクラスが friend として定義
されていると、private や protected メンバーへの参照が許される。例えば、
class X;とすると、 X::f(Y a) やクラスZ のすべての関数はクラス Y の private メンバーの参照が可能になる。
class Y {
private:
int num, denom;
public:
friend int X::f(Y a);
friend class Z;
};
class X {
public:
int f(X a);
};
int X::f(Y a)
{
return a.num/a.denom;
}
クラスの静的データーメンバー局所(local) ブロックないで宣言された名前 ブロック内だけで有効、寿命は宣言からブロックの終了まで。
動的に(new で)確保された変数は、その領域が解放されるまで(delete されるまで)。関数(function) GOTO 文で使われる文ラベル -- 定義された関数内のみで有効
クラス(class) クラスのメンバー名 -- クラス内で有効
大域(global) ブロックやクラスの外で宣言された名前 宣言以後のファイル中のどの関数からでも参照ができる。
大域変数のリンクは default は外部リンク(external)。static が指定されると内部リンクになる。外部リンク:名前が一致すれば他のファイルの変数または関数と同じものとされる。ただし、定数識別子(const)は default で内部リンクである。
内部リンク:変数や関数はそのファイルだけで有効。他のファイルに同じ名前のものがあっても別の変数や関数である見なされる。
static がつくと、クラスのデータメンバーは静的になる。静的データーメンバーは、個々のオブジェクトには結合せず、クラスに対して一つメンバーが確保されるだけである。生成されたオブジェクトの個数など、クラス全体のデーターを保持するために使用される。静的メンバーはコンパイル時に割り当てられるので、オブジェクトが生成される前に参照することができる(スコープ解決演算子 :: を使って)静的データメンバーの初期化にはコンストラクターは使用しない。静的変数と同様に、
等のようにする。int MyClass::myvalue=0 ;
object
an entity that contains some data and an associated set of actions that operate on the datamessage
You send a message to an object to make it perform one of its actions.class
defines the implementation of a particular kind of object.instance variables
variables defined in a classmethods
a routine implemented to a class to process message sent to a object.subclass/superclass
subclass is can be defined in terms of an existing superclass.
int x ; 変数--"X という値を示す。
int *y ; ポインター--"Y" という値を格納しているアドレス。
int& z ; 参照変数--"アドレスを指す変数。例:
ポインターを使った引数渡しvoid swapi( int *a, int *b)
{
int tmp=*a ;
*a = *b ;
*b = tmp;
}
int x,y;
swapi( &x, &y );参照を使った引数渡し
void swapir( int& a, int& b)
{
int tmp;
tmp=a;
a=b;
b=tmp;
}int x,y;
swapir( x, y);