如何动态创建和使用从基类派生的类?

时间:2018-09-05 22:11:17

标签: c++ pointers inheritance

我想使用指向父类的指针来分配和使用子类对象。我有一个带子Dog类的Animal类,Assign类应将Dog类添加到其Animal指针数组(Animal**animals)中。目前cout<<animals[0]->weight正确输出,但是animals[0]->breed给出错误:Class 'Animal' has no member named 'breed'。我必须这样做,因为这是实际操作(这也是一个简化的示例,因为在实际示例中,我们将具有一组Animal /派生的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 :(得分:0)

Animal(基类)没有breed成员变量,因此您收到错误。即使Dog具有品种成员变量,Animal对此一无所知。正确的代码是使用AnimalDog指针转换为dynamic_cast来向下转换类层次结构,然后您将可以访问该类成员:

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

请注意,一般来说,优良作法是在使用dynamic_cast之前返回的指针是否不是NULL,因为如果强制转换失败,它可以返回NULL