我确定这个问题已经以某种形式被提出,但是我找不到线索。请考虑下面的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