2011-02-06 69 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.