私はこの質問が既にある形で頼まれていると確信していますが、手がかりを見つけることができませんでした。呼び出し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でよろしく
'common.h'には何がありますか? – robert
この質問を見るC.cppのA:setVisibilityを定義している場合は、http://stackoverflow.com/questions/4891139/inheritance-of-virtual-member-functions-with-the-ameame/4891406#4891406 – UmmaGumma
それはあなたが質問を投稿する際に間違っていますか?それ以外の場合は、1つの定義ルールに違反しています。 – Francesco