C ++错误:从继承转换无效

时间:2014-06-17 05:45:33

标签: c++ inheritance type-conversion

我是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) ;
} 

1 个答案:

答案 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

相关问题