Как использовать dynamic_cast - PullRequest
       0

Как использовать dynamic_cast

2 голосов
/ 21 апреля 2019

Я пытаюсь использовать dynamic_cast - безуспешно. У меня есть класс BASE и класс A, производный от BASE. Я хочу иметь указатель на объект класса BASE, который я позже хочу привести к классу А. Я явно не делаю это правильно. Следующий код компилируется:

#include <cstdio>

class BASE {
private:

    int i;

public:

     BASE(void) {i = 1; }
     virtual ~BASE(){}

     virtual void id() { printf("CLASS BASE\n"); }
 };

class A : public BASE {
public:
    A(void): BASE() {}
    A(const BASE & base) : BASE(base) {}
    A& operator = (const BASE & base) { static_cast<BASE&>(*this) = base; return *this; }

    void id() override { printf("CLASS A\n"); };
};


int main() {

    BASE* base = new BASE();

    base->id();

    A* a = new A(*base);

    a->id();

    A* anotherA = dynamic_cast<A*>(base);

    if(!anotherA) 
        printf("anotherA is NULL\n");
    else    
        anotherA->id();
}

но его запуск дает:

CLASS BASE
CLASS A
anotherA is NULL

Я уверен, что упускаю что-то очень простое, но я продолжаю смотреть на код и не вижу, что я делаю неправильно. Буду очень признателен за любую помощь.

Я смотрел на

Когда следует использовать static_cast, dynamic_cast, const_cast и reinterpret_cast?

но не понимаю, почему dynamic_cast не работает - разве это не простое уныние?

1 Ответ

5 голосов
/ 21 апреля 2019

Я уверен, что упускаю что-то очень простое

Вы делаете.

Если у вас есть объект типа A и указатель на этот объект типа A*, указатель можно преобразовать в введите BASE*. Это преобразование частично забывает информацию о типе.

Теперь, имея указатель типа BASE*, , если этот указатель фактически указывает на объект A (то есть он был преобразован из типа A* в некоторый момент), вы можете вспомните информацию о забытом типе, приведя указатель обратно к типу A*.

Если ваш указатель не указывает на объект типа A для начала, то ничего не было забыто и вспомнить нечего.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...