基底クラスは、以下より、より専門的なクラスの抽象化です。その結果、基盤はそれを派生するものについて何も知らず、知る必要もない。すべてのクラスの知識はそれ自体であり、それが利用できるクラスに基づいています。また
、C++ビルドプロセスは、それが不可能な将来の子クラスのすべての可能な順列を知ることができます。まだ書かれていないかもしれないコードについて知っていなければならないでしょう。また、後で、または実行時にリンクされているかもしれないし、そうでないかもしれない他のモジュールにあるかもしれません。あなたは何もする必要はありませんほとんどの時間サブクラスを通じて、基本クラスのメンバを操作するため
。 public
とprotected
の場合、サブクラスで基本クラスの内容にアクセスできます。 private
データは通常どおりオフになります(ただし、friend
船を参照してください)。
基底クラスがint x
x = 24;
を持っている場合は、ほとんどの場合のために仕事を行います。ベースとサブクラスの両方が同じ名前の変数がある場合
これが唯一の問題になります。
いくつかのコードのための時間:
#include <iostream>
struct object // using struct because it defaults to public access.
// This makes for a simpler example
{
int x;
int y;
};
struct robot:public object
{
int x; // variable hides the x in object
int y;
void print()
{
std::cout << "robot: " << x << ',' << object::x << '\n';
// to access object's x we must ask for it explicitly
}
};
struct betterrobot:public object
{
void print()
{
std::cout << "better robot: " << x << ',' << object::x << '\n';
}
};
int main() {
robot rob;
rob.x = 24; // set robot's x
rob.object::x = 42; // set object's x
rob.print();
betterrobot rob2;
rob2.x = 24;
rob2.print();
return 0;
}
出力:
ロボット:24,42
優れたロボット:24,24
Object
とrobot
自分を持っていますown x
およびy
。 object
のx
は、明示的にx
とobject::x
異なる答えを与えたを印刷し、出力で
rob.object::x = 42;
それを要求することによりrobot
を介して到達することができます。あなただけ
rob.x = 24;
スマートコンパイラは、すぐにそれがrobot::print
方法を見ているようobject::x
を初期化しないためにあなたに悲鳴を上げるれます。そうでなければ、幸せなデバッグ!
これは脳に大混乱を引き起こすため、めったにやりたくないことです。あなたは2つのx
を持っており、polymprphicオブジェクト(注:事実を単純にするために例ではポリモーフィックオブジェクトはありません)で作業しているときは、本当にうまくいき、間違って設定するのは簡単ですx
。それを避ける方法がない限り、これをしないでください。
混乱を避けるために、基本クラスの変数を継承して使用するほうが、ほとんど常に良いです。これはbetterrobot
の機能です。 betterrobot
はobject
のx
とy
しか持っていません。混乱の可能性はありません。
rob2.x = 24;
です。出力では、x
とobject::x
の印刷で同じ回答が得られました。
object
と同様にbetterrobot
を移動することができます。 object
、move
などの機能を使用して、betterrobot
を地図上で移動することができます。特別な魔法は必要ありません。
あなたの投稿を編集して、 'objects'クラスと' robot'クラスの内容を含めてください。 –
'ロボット'が 'オブジェクト'から派生し、 'オブジェクト'のみが 'x'と' y'を持つ場合、 'ロボット'は 'x'と' y'のインスタンスを一度しか持ちません。タイトル質問に答えるには - それは – Fureeish
ベースはそれから派生するものについては何も知らない。必要とされる非因果的な行動について考えてみてください。 – user4581301