Ваш Base
класс имеет член type
и функцию виртуального члена getType()
, которая возвращает значение члена type
. Ваши классы A
, B
и C
происходят от Base
. Это означает, что все они имеют подобъект Base
. Этот подобъект содержит член Base::type
. Кроме того, все они также добавляют еще один элемент type
, который никогда больше не используется. Кроме того, ни один из них не отменяет метод getType
. Поэтому всякий раз, когда вы вызываете
instanceOfX->getType()
, даже если instanceOfX
указывает на экземпляр одного из производных классов, поскольку ни один из производных классов не перезаписывает getType
, вы в конечном итоге вызовете Base::getType
, который вернет значение Base::type
, которое всегда равно _Base
…
То, что вы на самом деле хотели, было, вероятно, что-то вроде:
struct Base
{
virtual Type getType() const = 0;
protected:
Base() = default;
Base(Base&&) = default;
Base(const Base&) = default;
Base& operator =(Base&&) = default;
Base& operator =(const Base&) = default;
~Base() = default;
};
class A : public Base
{
public:
Type getType() const override { return _A; }
};
class B : public Base
{
public:
Type getType() const override { return _B; }
};
class C : public Base
{
public:
Type getType() const override { return _C; }
};
Обратите внимание, что это почти наверняка плохой дизайн. Единственная цель, которой мог бы служить такой метод getType
, - чтобы клиентский код мог определить конкретный тип объекта, на который указывает Base*
. Если вам когда-нибудь понадобится эта информация, ваш дизайн нарушает принцип подстановки Лискова …
Помимо всего этого, обратите внимание, что _Base
, _A
, _B
и _C
зарезервированные имена [lex.name] / 3 , которые вы не должны использовать в коде C ++…