は何が起こるかを示す小さな例です。 - Aは10 でのxを初期化します - あなたは呼び出しがうまくどのように仮想関数とあなたの親を呼び出すと、あなたは初期化されていてもうまくいく(どのように見ることができます下のBは20 でのxを初期化します値が異なっ)
心に留めておくべき最大のものは、あなたがあなたのスーパー機能(:: GETX)を呼び出した場合でも、それはまだ独自のクラス(B :: x)の
からの値を使用していることです
class A
{
public:
A::A() : x(10) {}
virtual int GetX() {return x*2;}
protected:
int x;
};
class B : public A
{
public:
B::B() : A()
{
x = 20;
}
virtual int GetX() {return x;}
};
int _tmain(int argc, _TCHAR* argv[])
{
A* a1 = new A();
B* b1 = new B();
int test1 = a1->GetX(); // returns 20 (because x is 10, but function doubles value)
int test2 = b1->GetX(); // returns 20 (because x is initialized at 20)
return 0;
}
GE B :: GETXへ:
virtual int GetX() {return A::GetX();}
私たちは、次のような結果を得る:
int _tmain(int argc, _TCHAR* argv[])
{
A* a1 = new A();
B* b1 = new B();
int test1 = a1->GetX(); //returns 20 (as previously)
int test2 = b1->GetX(); // return 40 (x is initialized by B at 20, but then the
// A:GetX is called, which doubles the result)
return 0;
}
ために多重継承のない 'super'はありませんが。 –
Hmmmmポインタを返すgetアクセサを持つプライベート変数 - – Ricibob
@Ricibob私はそれがいいのではないことを知っていますが、それは私のコードではありません。私はずっと前に書いたことに取り組んでいます。残念ながら時間のリファクタリングはすべてありません。 –