2012-02-28 24 views
1

私は主にJavaとAS3のプログラマですが、今はC++で作業していますが、問題が発生しました。 プライベート変数var1を持つ基本クラス(ClassAと呼ぶ)を持っています。このクラスでは、その変数へのポインタを返すgetVar1()メソッドがあります。C++スーパークラスを呼び出す

次は、Baseを拡張する別のクラスがあります(ClassBとしましょう)。スーパークラスからgetVar1()を呼び出すにはどうすればよいですか? javaではthis.var1 = super.getVar1()と同じくらい簡単です。

私はvar1 = ClassA :: getVar1()と似ているが、これは変数付きの作業(別名ポインタが変わる可能性がある)であれば分かりません。

ありがとうございました。

+0

ために多重継承のない 'super'はありませんが。 –

+2

Hmmmmポインタを返すgetアクセサを持つプライベート変数 - – Ricibob

+0

@Ricibob私はそれがいいのではないことを知っていますが、それは私のコードではありません。私はずっと前に書いたことに取り組んでいます。残念ながら時間のリファクタリングはすべてありません。 –

答えて

5

ClassA :: getVar1()と呼んでも構いません。

ただし、Javaの方法が必要な場合は、メソッドを「仮想」にすることができます。これは、getVar1()を書くたびに、その前に書いた型(コンパイル時)に依存しませんが、呼び出すときに(実行時に)オブジェクトの型によって異なります。このため、C++は適切なメソッドを見つけるために内部のvテーブルを保持しています。これはJavaの方法と同等であり、遅延バインディングと呼ばれます。あなたは大藤ClassA::getVar1()を呼び出すために機能するかを識別するためのコンパイラを助けるために使用する必要があり、その後ClassB内の別のgetVar1()を定義した場合

3

getVar1()

class ClassB : public ClassA 
{ 
... 
    void foo() { yourvartype* v = getVar1(); ... } 
}; 

十分なはずです。ここで

2

は何が起こるかを示す小さな例です。 - 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; 
} 
関連する問題