首页 > 解决方案 > C ++将新类实例化为继承的类类型

问题描述

假设我有一个抽象类 Car,Ford 和 Mazda 类都是从该类派生的。

class Car{
public:
    float fuel_capacity = 0;
    virtual float get_fuel_capacity();
    virtual void set_fuel_consumption(float x);
}
class Ford : public Car
{
public:
    Ford();
    float get_fuel_capacity() {return fuel_capacity}
    void set_fuel_capacity(float x) {fuel_capacity = x};
};
class Mazda: public Car{
public:
    Mazda();
    float get_fuel_capacity() {return fuel_capacity}
    void set_fuel_capacity(float x) {fuel_capacity = x};
};

使用这些类,我想定义一个包含我的汽车的车库:

class Garage{
    stack<Car> cars;
    void add_car(Car x){cars.push(x)}
    Car get_cars(){return cars;}
}

现在我认为通过要求抽象类add_car我可以传递任何派生类型,但似乎我不能因为no suitable constructor exists to convert from "Ford *" to "Car"弹出。

所以我有它。我怎么能这样称呼:

Garage g;
g.add_car(new Ford());
g.add_car(new Mazda());

我什至不知道如何在谷歌上搜索这个:(

标签: c++

解决方案


在这种情况下,您的问题不是继承,而是您将指针作为参数传递给请求值的方法这一事实。

您应该通过执行以下操作更改您的Garage课程以解决此问题:

class Garage {
    stack<Car*> cars;
    void add_car(Car* x) { cars.push(); }
}

另请注意,您get_car不会编译,因为您的返回类型与您实际返回的内容不匹配。您应该将返回类型更改为类似const stack<Car*>&.

但正如idclev463035818所说:您似乎缺乏一些基础知识。
有时可能很难阅读 C++ 编译器错误,但这是非常基本的内容,以至于当编译器告诉您该行存在问题时,您只需查看该行并查看您的错误。这是一种可以通过阅读有关 C++ 的书(或类似的东西)而不是问 SO 问题来解决的问题。


推荐阅读