2011-02-06 22 views
0

私はこの質問が既にある形で頼まれていると確信していますが、手がかりを見つけることができませんでした。呼び出しC++継承:仮想メンバーは再宣言を必要としますか?

// A.h 
class A 
{ 
    public: 
     A(); 
     virtual ~A(); 
     virtual void setVisibility(bool v); 
     virtual bool setVisibility(); 

    protected: 
     bool visibility; 
}; 

// B.h 
class B : public A 
{ 
    public: 
     B(); 
     virtual ~B(); 
}; 


// C.h 
class C : public B 
{ 
    public: 
     C(); 
     virtual ~C(); 
     virtual void setVisibility(bool v); 
     virtual bool setVisibility(); 
}; 

// A.cpp 
#include "common.h" 
A::A() {} 
A::~A() {} 
void A::setVisibility(bool v) { this->visibility = v; } 
bool A::setVisibility() { return this->visibility; } 

// B.cpp 
#include "common.h" 
B::B() {} 
B::~B() {} 

// C.cpp 
#include "common.h" 
C::C() {} 
C::~C() {} 
void C::setVisibility(bool v) { /* do nothing */ } 
bool C::setVisibility() { return false; } 

// common.h - does nothing else than joining the header files together 
#include "A.h" 
#include "B.h" 
#include "C.h" 

::私はいくつかのことを試してみました

C* myC = new C(); 
cout << "Set visibility true" << endl; 
myC->setVisibility(true); 

コード - 以下のC++をご検討ください。両方のメソッドをC言語で宣言するとコンパイルされますが、myC->setVisibility(true)にセグメンテーション違反があります。宣言を取り除くと(これはBとAから継承されているので、必要ではないはずです)、Cはこれらのメソッドを持たないと私に伝えます。

そして私はそれがこれらのメソッドのない実装は、私が今何をすべきB.

でありませんと言われます、私はどこにでもBを含め、それらを宣言する場合はBのメソッドを再実装する必要はありませんか?呼び出しの例では常にCを可変型として使用するとは限らないので、仮想が必要です。

私は64ビットマシンでGCCを使用しています。


編集:コピー/ペーストのミスを修正しました。単純化のためにクラスA、B、Cと命名し、コードを正しくコピーしませんでした。を追加しましたCOMMON.H
編集3:うーん...実際にこのコードをコピーすることは流暢に動作しますが、残念ながら、問題が
編集2のまま。しかし、アーキテクチャは同じです。私は、フラグ-shared -fPICを使用して自分のコードを共有ライブラリにコンパイルする以外は、呼び出しコードは、このライブラリを使用するアプリケーション内にあります。他には何もありません。再度確認してください。

私は正しい方向を指すヒントありがとうございます。 C.cppでよろしく

+0

'common.h'には何がありますか? – robert

+0

この質問を見るC.cppのA:setVisibilityを定義している場合は、http://stackoverflow.com/questions/4891139/inheritance-of-virtual-member-functions-with-the-ameame/4891406#4891406 – UmmaGumma

+0

それはあなたが質問を投稿する際に間違っていますか?それ以外の場合は、1つの定義ルールに違反しています。 – Francesco

答えて

0

で定義されてsetVisibilityのすべての種類は、他の回答を訂正する前に、すべての正しい「再導入」します。しかし、それは問題の解決策ではありません。実際には全く問題はありません。問題は、私が実装したsetVisibilityの方法にあります。これは、segfaultが発生する場所です。したがって、ここで解決策を見つけることはできません。

すべてのお手伝いをしてくれてありがとうございます! について

4

A::setVisibility()を定義しない、それはC.cppC::setVisibility()

+0

申し訳ありません。タイプミス。私のコメントと更新されたバージョン – Atmocreations

1

する必要があり、あなたはA::setVisibility、ないC::setVisibilityを定義しています。

+0

をご確認ください。タイプミス。私のコメントと更新されたバージョン – Atmocreations

0

あなたはあなたにクラスCを変更することができます。

// C.h 
class C : public B 
{ 
    public: 
     C(); 
     virtual ~C(); 
     using A::setVisibility; 
     virtual bool setVisibility(); 
}; 

これはA.

+0

を確認してください申し訳ありませんが、それは入力ミスでした。更新されたバージョンをチェックする場合、これはまだ必要ですか? – Atmocreations

関連する問題