クラスderived
のすべてのオブジェクトは、クラスbase
のオブジェクトであるように、継承は、「ある-」の関係を表現しています。 derived
オブジェクトは、base
オブジェクトが行うすべてのデータとメソッド、およびderived
クラス宣言で明示的に宣言されたデータとメソッドを持っています。
Base
クラスの実装に依存するクラスDerived
を書くことは、完全に可能です(そして一般的です)。たとえば、私たちは
class Base {
public:
Base() { n = 5; }
int GetN() const { return n; }
private:
int n;
};
class Derived : public Base {
public:
Derived() { m = GetN() * 2; }
int GetM() const { return m; }
private:
int m;
};
があると今、私たちは
Derived* d = new Derived();
std::cout << d->GetM() << std::endl;
が、それは(私の一部に間違いがなければ)行う必要があります正確に何である、10
を印刷することを期待したいです。これは完全に合理的な(ちょっと人工的な)ことです。
言語は、このようなコードが正しく動作するために得ることができる唯一の方法は、タイプDerived
のオブジェクトを構築する際にDerived
コンストラクタの前にBase
コンストラクタを実行することです。 Derived
コンストラクタはBase
から継承したGetN()
メソッドを呼び出すことができるため、Base
コンストラクタで適切に初期化されたデータメンバn
に依存します。要約する
任意のDerived
オブジェクトを構築するときDerived
がBase
-であり、一般的に、それの実装とデータに依存しますので、C++は最初Base
オブジェクトとして構築する必要があります。あなたのコード内
base* b = d;
を行うと
、あなたは変数の型であるb
「base
オブジェクトへのポインタ」を宣言してからd
で開催された同じメモリアドレスを使用して、この変数を初期化しています。コンパイラはすべてderived
オブジェクトARE base
のオブジェクトなので、これを行う気にしないので、d
をb
として扱いたいと思うかもしれません。ここではオブジェクトに実際に何も起こりませんが、ポインタ変数の宣言とインスタンス化です。 d
が指し示すオブジェクトは、すべてderived
オブジェクトがベースオブジェクトであるため、すでにbase
オブジェクトでした。
この説明は意図的に少し曖昧になっていて、C++の基底クラスと派生クラスの関係について完全な説明はありません。あなたは他の記事/書籍/その標準を調べることになります。私はこれが初心者のために比較的理解しやすいことを望む。
あなたは他にどんなことを期待していますか? – user0042
ヒント: 'derived'の中に' base' **サブオブジェクト**があります。 – StoryTeller
質問は明確ではありません。説明できますか? – MoraRockey