我是C ++的新手。我正在学习C ++中的继承。我无法理解编译时错误。 我有超级可衡量,汽车和国家来自可衡量。在可衡量的我有 纯子函数getMeasurable,由子类重写。我有Data类 迭代可衡量的对象(汽车或国家)并计算平均值。
我遇到了错误
measure.cc: In function ‘int main()’:
measure.cc:70: error: invalid conversion from ‘Car**’ to ‘Measurable**’
measure.cc:70: error: initializing argument 1 of ‘static int Data::avg(Measurable**, int)’
代码
#include <iostream>
class Measurable ;
class Measurable {
public:
virtual int getMeasurable() = 0 ;
};
class Country: public Measurable {
private:
int size ;
public:
Country(int size): size(size) {
}
int getMeasurable() {
return size ;
}
};
class Car: public Measurable {
private:
int mileage ;
public:
Car(int size): mileage(size) {
}
int getMeasurable() {
return mileage ;
}
};
class Data {
public:
static int avg ( Measurable* obj[] , int num) {
double size = 0 ;
for (int i = 0 ; i < num ;i++)
{
size += obj[i]->getMeasurable() ;
}
return size/num ;
}
};
int main () {
Car* fleet[] = {
new Car (1) , new Car (2) , new Car (3) , new Car (4)
};
double sum = Data::avg (fleet ,4) ;
}
答案 0 :(得分:3)
错误消息很明确,Car**
和Measurable**
是不同的类型,并且不能隐式转换(尽管Car*
可以转换为Measurable*
)。 it is dangerous to use polymorphic array也是{{3}}。您可以尝试以下解决方案:
template<class T>
class Data {
public:
static double avg ( vector<T>& obj) {
double size = 0 ;
for (int i = 0 ; i < obj.size() ;i++)
{
size += obj[i].getMeasurable() ;
}
return size/obj.size() ;
}
};
int main () {
vector<Car> fleet;
fleet.push_back( Car(1));
fleet.push_back( Car(2));
fleet.push_back( Car(3));
fleet.push_back( Car(4));
double sum = Data<Car>::avg (fleet) ;
cout<<sum<<endl;
}
如果要创建继承自Measurable
的其他类,并希望以通用方式使用该方法,则可以使用指针,但必须手动分配/取消分配它们。
class Data {
public:
static double avg ( vector<Measurable*> obj) {
double size = 0 ;
for (int i = 0 ; i < obj.size() ;i++)
{
size += obj[i]->getMeasurable() ;
}
return size/obj.size() ;
}
};
int main () {
vector<Measurable*> fleet;
fleet.push_back(new Car(1));
fleet.push_back(new Car(2));
fleet.push_back(new Car(3));
fleet.push_back(new Car(4));
double sum = Data::avg (fleet) ;
cout<<sum<<endl;
for (int i=0;i<fleet.size();i++)
{
delete fleet[i];
}
fleet.clear();
}
请注意,基类析构函数应始终为virtual
。