C++ 继承 : virtual member needs redeclaring?

标签 c++ segmentation-fault virtual-functions

我确定这个问题已经以一种或另一种形式提出过,但我找不到线索。请考虑以下 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/

相关文章:

c++ - 为什么在运行时调用虚函数需要虚表?

c - 为什么这个c程序中出现Segmentation failure错误?

c - 使用指向结构的指针数组将结构的元素设置为随机 double 值

c - C 中的随机字母 [段错误]

c++ - 关于虚函数的问题

c++ - 虚函数和绕行

c++ - 使用模板的动态特征声明类型

c++ - C++ 中没有 `while (!my_ifstream.eof()) { getline(my_ifstream, line) }`?

c++ - C++ 中的指针和引用

c++ - C 中的 ip 地址搜索算法或库