【发布时间】:2021-04-05 04:54:40
【问题描述】:
我有一个程序有四个类:
- 车辆(基地)
- 汽车(源自车辆)
- 汽车(源自汽车)
- 卡车(源自汽车)
在运行时,用户使用工厂函数生成作为“汽车”或“卡车”的汽车对象:
Automobile *Automobile::make_automobile(std::string choice) {
if (choice == "car")
return new Car;
else if (choice == "truck")
return new Truck;
else
return nullptr;
}
现在,“Car”类具有三个唯一的 setter(和三个匹配的 getter):
- Set_NumDoors()
- Set_SeatMaterial()
- Set_Shape()
“卡车”类有一个唯一的 setter(和一个匹配的 getter):
- Set_CargoWeight()
起初,这些函数只在它们自己的类中实现,但我无法在运行时调用它们,因为创建的对象是“汽车”对象。我已经使用具有本地覆盖的虚拟函数解决了这个问题。所以现在,“汽车”类的所有四个功能(以虚拟形式),默认情况下什么都不做。但是,当在对象上调用时,本地覆盖执行正确的功能。下面是一个示例,一切正常。
汽车类中的定义
std::string defaultStatement = "Function call is invalid on current object";
virtual int set_seatMaterial(std::string choice){
std::cout << defaultStatement << std::endl;
return -1;
}
在 Car 类中覆盖
int set_seatMaterial(std::string choice) override { // override virtual base
if (choice == "leather" || choice == "cloth"){
seatMaterial = choice;
return 0;
}
else
return -1;
}
然后我在 main() 中使用函数指针来适当地指向所需的函数:
if (user_choice == "seat"){
std::function<int(Automobile*, std::string)> choiceFunction = &Automobile::set_seatMaterial;
choiceFunction(userVehicle, seatMaterial);
}
我唯一的问题是 - 这是实现此功能的最佳方式吗?它可以工作,但现在我已经声明了“汽车”类中的每个函数,它已经有自己的 getter/setter。虽然我理解多态性的概念及其用处,但从某种意义上说,这似乎是重复。
或者有没有更好的方法从基类对象调用派生类函数?
【问题讨论】:
-
Automobile::set_seatMaterial函数应该是抽象的而不是实现的。 IE。virtual int set_seatMaterial(std::string choice) = 0; -
choiceFunction这样的设计原因是什么?简单的userVehicle->set_seatMaterial(seatMaterial)有什么问题? -
用于运行时操作。我不知道他们要设置车辆的哪个属性,所以指针抓取他们选择的函数然后调用它。
-
"X 是实现 Y 的最佳方式吗?"恕我直言,这个问题很可能会用意见而不是事实和引用来回答。它应该进行更新,以便得出基于事实的答案。在那之前,我投票接近。
-
我应该如何更新它以反映这一点?询问有关最佳做法的建议不是一个有效的问题吗?
标签: c++ class object c++11 polymorphism