почему первый Dynamic_cast не приведен к базовому классу? - PullRequest
0 голосов
/ 14 октября 2019

Я думал, что первый "pd" может привести к Базовому классу.

Я пытался изменить Derived *pd; на Base *pd; и pd = dynamic_cast<Derived*>(pba); на pd = dynamic_cast<Base*>(pba);

Однако этидва также не приводятся к базовому классу.

Выходные данные всегда показывают

нулевой указатель при втором приведении типов. Нулевой указатель на третье приведение типа. Пустой указатель на четвертое приведение типов.

Как я могу получить первое приведение типов?

также, почему мой код не показывает первое приведение типа?

 #include <iostream>
 #include <exception>
 using namespace std;
 class Base { virtual void dummy() {} };
 class Derived : public Base { int a; };
 class DerivedSecond : public Base { int b; };
  int main() {
      try {
        Base * pba = new Derived;
        Base * pbc = new DerivedSecond;
        Base * pbb = new Base;

        Derived* pd;
        Base * pbase;

       pd = dynamic_cast<Derived*>(pba);
       if (pd == 0) cout << "Null pointer on first type-cast.\n";


       pd = dynamic_cast<Derived*>(pbc);
       if (pd == 0) cout << "Null pointer on second type-cast.\n";
       pd = dynamic_cast<Derived*>(pbb);
       if (pd == 0) cout << "Null pointer on third type-cast.\n";
       pbase = dynamic_cast<Base*>(pba);
       if (pd == 0) cout << "Null pointer on fourth type-cast.\n";


}
catch (exception& e) { cout << "Exception: " << e.what(); }
return 0;

}

1 Ответ

0 голосов
/ 14 октября 2019

Первый dynamic_cast здесь pd = dynamic_cast<Derived*>(pba);. Это не приведение к классу Base, поскольку цель приведения указана в символах <>, а здесь цель - указатель Derived.

Чтобы привести в класс Base, вам нужно использовать dynamic_cast<Base*>.

...