2011-02-06 70 views
0

我確定這個問題已經以某種形式被提出,但是我找不到線索。請考慮下面的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
+0

common.h是什麼? – robert 2011-02-06 14:03:37

+0

也看這個問題http://stackoverflow.com/questions/4891139/inheritance-of-virtual-member-functions-with-the-same-name/4891406#4891406 – UmmaGumma 2011-02-06 14:06:37

+0

在C.cpp你正在定義A :: setVisibility ,是否在發佈該問題時發生了錯誤?否則你違反了One定義規則.. – Francesco 2011-02-06 14:07:23

回答

0

定義其他的答案是修正前正確的。但這不是解決問題的辦法。實際上根本沒有任何問題。問題在於我實現了setVisibility-方法,這就是段錯誤發生的地方。因此在這裏找不到解決方案。

感謝所有試圖幫助的人! 關於

4

,不要定義A::setVisibility(),它應該是C::setVisibility()

1

C.cpp,你定義A::setVisibility,不C::setVisibility

0

您可以在C類更改爲:

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

這將「重新引入」各種setVisibility在A.