我確定這個問題已經以某種形式被提出,但是我找不到線索。請考慮下面的C++ - 代碼: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語言實際上聲明瞭這兩種方法,它會編譯,但我在myC->setVisibility(true)
處遇到了分段錯誤。如果我刪除聲明(不管怎麼說都不需要,因爲它們是從B和A繼承的,對嗎?),那麼它告訴我C沒有這些方法。
而且我不希望如果我宣佈他們無處不在包括B重新實現在B的方法,它告訴我,有一個在B.
我現在應該做的沒有實現這些方法?我需要虛擬的,因爲在調用示例中,我並不總是使用C作爲變量類型。
我在64位機器上使用GCC。
編輯:更正了複製/粘貼,錯誤。爲簡單起見,我命名了A,B和C類,並沒有正確複製代碼。但不幸的是,這個問題仍然
編輯2:新增COMMON.H
編輯3:嗯......其實複製此代碼的工作流利。但是架構是一樣的。除了我使用標記
-shared -fPIC
將我的代碼編譯到共享庫中。調用代碼位於使用此庫的應用程序中。沒有別的不同。再次檢查。
感謝任何提示指向正確的方向。關於
在C.cpp
common.h是什麼? – robert 2011-02-06 14:03:37
也看這個問題http://stackoverflow.com/questions/4891139/inheritance-of-virtual-member-functions-with-the-same-name/4891406#4891406 – UmmaGumma 2011-02-06 14:06:37
在C.cpp你正在定義A :: setVisibility ,是否在發佈該問題時發生了錯誤?否則你違反了One定義規則.. – Francesco 2011-02-06 14:07:23