我想使用指向父类的指针来分配和使用子类对象。我有一个带子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;
}
答案 0 :(得分:0)
Animal
(基类)没有breed
成员变量,因此您收到错误。即使Dog
具有品种成员变量,Animal
对此一无所知。正确的代码是使用Animal
将Dog
指针转换为dynamic_cast
来向下转换类层次结构,然后您将可以访问该类成员:
cout<<dynamic_cast<Dog*>(animals[0])->breed<<endl;
请注意,一般来说,优良作法是在使用dynamic_cast
之前返回的指针是否不是NULL
,因为如果强制转换失败,它可以返回NULL
。