Как динамически создавать и использовать производный класс из базового класса? - PullRequest
0 голосов
/ 06 сентября 2018

Я хочу использовать указатель на родительский класс для выделения и использования объекта дочернего класса. У меня есть класс Animal с дочерним классом Dog, класс Assign должен добавить класс Dog в свой массив указателей Animal (Animal**animals). В настоящий момент cout<<animals[0]->weight выводит корректно, но animals[0]->breed выдает ошибку: Class 'Animal' has no member named 'breed'. Я должен сделать это так, как на практике (это также упрощенный пример, так как в реальном примере у нас будет массив объектов Animal / производных животных). Вот код:

#include <iostream>
#include <string>
#include <iomanip>

using namespace std;

class Animal{
public:
  double weight;
  Animal(double w){
    weight=w;
  }
  void shout(){
    cout<<"Weight: "<<weight<<endl;
  }
};

class Dog: public Animal{
public:
  string breed;
  Dog(string b,double w): Animal(w){
    breed=b;
    weight=w;
  }
};

class Asign{
public:
  Animal**animals;
  Asign(){
    animals=new Animal*[2];
    animals[0]=new Dog("Great Dane",12.2);
    cout<<animals[0]->breed<<endl;//Does not work
  }
};

int main(){
  Dog Duke("Great dane",12.2);
  Asign a;
}

1 Ответ

0 голосов
/ 06 сентября 2018

Animal (базовый класс) не имеет переменной-члена breed, в результате вы получаете ошибку. Даже если Dog имеет переменную члена породы, Animal ничего не знает об этом. Правильный код будет приведен к приведению указателя Animal к Dog с использованием dynamic_cast для понижения иерархии классов, тогда у вас будет доступ к члену класса:

cout<<dynamic_cast<Dog*>(animals[0])->breed<<endl;

Обратите внимание, что в целом рекомендуется проверять, не является ли указатель, возвращаемый dynamic_cast, значением NULL перед его использованием, поскольку он может вернуть NULL, если приведение не выполнено.

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