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