我确定这个问题已经以一种或另一种形式提出过,但我找不到线索。请考虑以下 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 中,不要定义 A::setVisibility()
,应该是C::setVisibility()
关于C++ 继承 : virtual member needs redeclaring?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4913702/