2017-12-05 11 views
-2

私はこのような何かをしよう:C++継承されオーバーライドされた基本クラスの属性の値にアクセスする方法は?

class A{ 
public: 
    A(){number = 1;} 
    int number; 
}; 
class B : public A{ 
public: 
    B(){number = 2;} 
}; 

class Base { 
public: 
    Base() {myAttribute = new A();} 
    int returnAttrNumber(){return myAttribute->number;} 
    A *myAttribute; 
}; 

class Inherited : public Base{ 
public: 
    Inherited(){myAttribute = new B();} 
    B *myAttribute; 
}; 


int main() 
{ 
    Inherited *i = new Inherited(); 
    std::cout << i->returnAttrNumber(); // outputs 1, because it gets the A not the B. I want it to output 2, to get the B object in returnAttrNumber() 
} 

ので、クラスベース継承オブジェクトAがA-派生オブジェクトBを保持して保持し、私は、基本クラスのメソッドを呼び出そうが、私

(返すそれがこのケースでの数字です)、それは可能な限り対応するオブジェクトのhirarchyにダウンキャスト(static_castをなし またはdynamic_castを)、その後、Bのオブジェクトではなく、Aを取ると、ものを行うことですしたいですC++の基底クラスからのダウンキャスティングを大きな困難なしに行う方法はありますか? ありがとうございます!

+2

現実的なコードを投稿してください。詳細は重要です。 – juanchopanza

+0

"これは、BaseではなくInheritedに格納された値を変更する必要があります。値を変更できるメンバーは1人だけです。ファンタジーコードを使用しないでください。これは文法エラーが多すぎて実際の質問から逸脱している – user463035818

+0

はい、申し訳ありませんが、修正しました。今のところ動作します – mep

答えて

0

だけでなく、riokiが言った、

ベースと継承されていますが、私は継承でBとしてMyAttributeを再宣言ためです異なる変数

を持っています。これは間違いでした。私は、同じ名前で宣言すると、同じ変数になると思った、それは間違っている。 これは、Inheritedでこの1行のコメントを外すことで解決します。作業コード:

class A{ 
public: 
    A(){number = 1;} 
    int number; 
}; 
class B : public A{ 
public: 
    B(){number = 2;} 
}; 

class Base { 
public: 
    Base() {myAttribute = new A();} 
    int returnAttrNumber(){return myAttribute->number;} 
    A *myAttribute; 
}; 

class Inherited : public Base{ 
public: 
    Inherited(){myAttribute = new B();} 
    //B *myAttribute; 
}; 


int main() 
{ 
    Base *i = new Inherited(); // this works, what is necessary in my case 
    std::cout << i->returnAttrNumber(); // outputs 2 now 
} 
0

これは非常にです。簡単な答えは、完全修飾IDを介して基本クラスから変数にアクセスできることです。 異なる変数を持つビットをキャストダウンについて

A: 1 
B: 2 

...ベースと継承されています:

#include <iostream> 

class A 
{ 
public:  
    A() 
    : var(1) {} 

protected: 
    int var; 
}; 


class B : public A 
{  
public: 
    B() 
    : var(2) {} 

    int getBVar() const 
    { 
     return var; 
    } 

    int getAVar() const 
    { 
     return A::var; 
    } 

private: 
    int var; 
}; 

int main() 
{  
    B b; 
    std::cout << "A: " << b.getAVar() << std::endl; 
    std::cout << "B: " << b.getBVar() << std::endl; 
} 

次を出力します。以下の例を見てみましょう。一方を他方に安全にすることはできません。

+0

ありがとうございました!私のプログラムの階層は多くのクラスを含んでいるので、うまくいかないかもしれませんが、これは可能です。これは私にとっては非常に特殊な問題ではないようですので、私はなぜ落とすことができないのですか、オブジェクトがヒントを与えることができないのはなぜでしょうか。正確にあなたは非常に悪いデザインを意味するのですか?それを行うためのより良い方法がありますか(私の例のように/そのような並行した仮説を立てるために)? – mep

+1

"myAttribute"のエイリアシングがあるためです。最初はすべて同じオブジェクトを指していますが、AがmyArtibuteを別のインスタンスに変更したとしましょう。 Bの実装について何も知らないので、それを更新することはできません。今、両方のポインタが*異なる*オブジェクトを指しています。 – rioki

関連する問題