基本的に私が知る限り、パブリックセクション、プロテクトセクション、プライベートセクションを含む基本クラスを作成すると、パブリックセクションとプロテクトセクションのそれぞれの変数/関数は、サブクラスの適切なセクション(クラスサブクラスによって定義される)に継承されます。 :プライベートベース。ベースのすべてのパブリックメンバーと保護されたメンバーを公開します。プライベートという単語をパブリックに変更すると、すべてがパブリックになり、保護に変更すると、すべてが保護されます)。
したがって、サブクラスを作成するときに、前のクラス(この場合は基本クラス)のプライベートセクションから何も受け取らない場合、これがtrueの場合、サブクラスのオブジェクトは独自のバージョンの基本クラスのプライベート変数または関数は正しいですか?
例を実行してみましょう:
#include <iostream>
class myClass // Creates a class titled myClass with a public section and a private section.
{
public:
void setMyVariable();
int getMyVariable();
private:
int myVariable; // This private member variable should never be inherited.
};
class yourClass : public myClass {}; // Creates a sub-class of myClass that inherits all the public/protected members into the
// public section of yourClass. This should only inherit setMyVariable()
// and getMyVariable() since myVariable is private. This class does not over-ride any
// functions so it should be using the myClass version upon each call using a yourClass
// object. Correct?
int main()
{
myClass myObject; // Creates a myClass object called myObject.
yourClass yourObject; // Creates a yourClass object called yourObject
yourObject.setMyVariable(); // Calls setMyVariable() through yourObject. This in turn calls the myClass version of it because
// there is no function definition for a yourClass version of this function. This means that this
// can indeed access myVariable, but only the myClass version of it (there isn't a yourClass
// version because myVariable is never inherited).
std::cout << yourObject.getMyVariable() << std::endl; // Uses the yourClass version of getMyVariable() which in turn
// calls the myClass version, thus it returns the myClass myVariable
// value. yourClass never has a version of myVariable Correct?
std::cout << myObject.getMyVariable() << std::endl; // Calls the myClass version of getMyVariable() and prints myVariable.
return 0;
}
void myClass::setMyVariable()
{
myVariable = 15; // Sets myVariable in myClass to 15.
}
int myClass::getMyVariable()
{
return myVariable; // Returns myVariable from myClass.
}
さて、理論的には、これは次のように出力されるはずです。15 15これは、常にmyClassバージョンの関数を使用しているためです(したがって、myClass myVariableを使用しています)。しかし、奇妙なことに、これは当てはまりません。このプログラムを実行した結果は次のようになります。150これは、実際にmyVariableを継承するだけでなく、それをいじくり回す機能もあるのだろうかと思います。明らかに、これはmyVariableの代替バージョンを何らかの形で作成しています。そうでない場合、myClassバージョンに0はありません。実際、これをすべて実行して、myVariableの2番目のコピーを編集しています。
誰かがこれをすべて私に説明してもらえますか、これは私の継承の理解を崩壊させました。