c++ - 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());
我什至不知道如何在谷歌上搜索这个:(
解决方案
在这种情况下,您的问题不是继承,而是您将指针作为参数传递给请求值的方法这一事实。
您应该通过执行以下操作更改您的Garage
课程以解决此问题:
class Garage {
stack<Car*> cars;
void add_car(Car* x) { cars.push(); }
}
另请注意,您get_car
不会编译,因为您的返回类型与您实际返回的内容不匹配。您应该将返回类型更改为类似const stack<Car*>&
.
但正如idclev463035818所说:您似乎缺乏一些基础知识。
有时可能很难阅读 C++ 编译器错误,但这是非常基本的内容,以至于当编译器告诉您该行存在问题时,您只需查看该行并查看您的错误。这是一种可以通过阅读有关 C++ 的书(或类似的东西)而不是问 SO 问题来解决的问题。
推荐阅读
- sql - 过滤使用 CASE Postgresql 创建的列
- node.js - Heroku NODE_ENV 为我设置为开发而不是生产
- c++ - 如何传递一个引用线程的函数?
- android - Jetpack 根据动态宽度撰写下一行的行项目
- python - tkinter“window.after”循环在夜间 Windows 睡眠/恢复后停止
- html - Git 实时预览 HTML 文件不起作用
- automated-tests - 为 QAF 编写 BDD 文件以检查特定路径上 excel 表(单元格中的数组)中的值
- swift - 如何实现将根据提供的项目数量(物理项目的数量)滚动的集合视图?
- javascript - 如何在服务器中正确显示我的项目?
- enums - 使用 Flags 属性将整数转换为枚举类型