Наследование C ++: виртуальный член нуждается в повторном выделении? - PullRequest
0 голосов
/ 06 февраля 2011

Я уверен, что этот вопрос уже задавался в той или иной форме, но я не мог найти подсказку.Пожалуйста, рассмотрите следующий код 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 в качестве типа переменной в вызывающем примере.

Я использую GCC на 64-битной машине.


Редактировать: Исправлена ​​ошибка копирования / вставки.Я назвал классы A, B и C для простоты и неправильно скопировал код.Но, к сожалению, проблема остается
Редактировать 2: Добавлен common.h
Редактировать 3: Хмм ...копирование этого кода на самом деле работает бегло.Но архитектура такая же.За исключением того, что я компилирую свой код в общую библиотеку, используя флаги -shared -fPIC.Код вызова находится в приложении, которое использует эту библиотеку.Ничто другое не отличается.Нужно проверить еще раз.

Спасибо за любые советы, указывающие мне в правильном направлении.С уважением

Ответы [ 4 ]

4 голосов
/ 06 февраля 2011

в C.cpp, не определяйте A::setVisibility(), должно быть C::setVisibility()

1 голос
/ 06 февраля 2011

В C.cpp вы определяете A::setVisibility, а не C::setVisibility.

0 голосов
/ 10 февраля 2011

Все остальные ответы верны до исправления. Но это не решение проблемы. Там на самом деле нет никаких проблем. Проблема заключается в моей реализации setVisibility -метода, именно здесь происходит ошибка. Поэтому решение не может быть найдено здесь.

Спасибо всем, кто пытался помочь! С уважением

0 голосов
/ 06 февраля 2011

Вы можете изменить свой класс C на:

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

Это "заново введет" все виды setVisibility, определенные в A.

...