如何使用基指针访问派生方法
How would you access derived methods using a base pointer ?
我看过几篇关于这个主题的文章,但没有找到我想要的解决方案。很抱歉在一开始又重复了一次。但我想知道,面对下面给出的情况,你们这些专家会怎么做?
class Vehicle // A base class
{
public:
static Vehicle* CreateInstance(const int createWhat)
{
switch(createWhat)
{
case 1:
return new Segway();
break;
case 2:
return new Car();
break;
}
}
};
现在我有几个派生类。。
class Segway : public Vehicle // Segway is a vehicle
{
};
class Sensor
class FuelConsumptionInfo;
class Car : public Vehicle // Car is a vehicle
{
public:
std::list<Sensor>& GetSensorList()
{
return m_pListOfSensors;
}
bool CompareThisCarAgainstOthers(std::list<Vehicle*>& vehicles) const
{
bool isMostEfficientCar = false;
std::list<Vehicle*>::iterator iterVal = vehicles.begin();
while(iterVal != vehicles.end())
{
// 1. Get the list of sensors of this car and compare against the sensors of this car ...
// 2. Get the fuel consumption information and compare against the fuel efficiency of this car ...
}
return isMostEfficientCar;
}
private:
std::list<Sensor*> m_pListOfSensors;
FuelConsumptionInfo* m_FuelEfficiency;
};
最后,我有了我最喜欢的车和一组其他的车,我想把我的车和它们进行比较。
int main()
{
std::list<Vehicle*> listOfOtherCars;
Vehicle* pMyFavCar = Vehicle::CreateInstance(2);
listOfOtherCars.push_back(Vehicle::CreateInstance(2));
listOfOtherCars.push_back(Vehicle::CreateInstance(2));
listOfOtherCars.push_back(Vehicle::CreateInstance(2));
listOfOtherCars.push_back(Vehicle::CreateInstance(2));
// How can I invoke the CompareThisCarAgainstOthers without:
// 1. Introducing any base class empty functions ..
// 2. Without using static/dynamic casting to convert the base pointer to a derived class pointer ...
}
正如在评论中已经提到的,我想调用CampareThisCarAgainstOthers,但我不想投射基类指针,也不想在基类中引入任何虚拟函数,我认为这会挑战基类的整个逻辑。即使引入空的虚拟基函数也无济于事,因为GetSensorList返回对该列表的引用。
我将非常感谢你的回答。
使用基指针访问子方法的唯一方法是将基指针强制转换为子指针。这有不良的副作用(在互联网上搜索"C++对象切片")。
一个问题是,你不知道基指针指向的是什么类型的子/对象。你可能会将指针强制转换为错误的子方法。示例:一个指向游轮的指针被传递给一个函数,该函数将指针指向车辆。在函数内部,指针被强制转换为Bicycle
类型时会发生什么情况。显然,不是同一辆车。
使用指向基类的指针可以安全访问的只有基类的公共方法和成员。不多不少。
例如,给定一个基类Car
和一些子类,如Model_T
、Tesla
、Hybrid
和Mustang
,以及一个指向Car
实例的指针,你不知道这个孩子是什么样的车。Model_T
与电动Tesla
不同。配备汽油发动机的Mustang
与配备电动发动机和汽油发动机的Hybrid
不同。
如果要使用基类指针访问功能,请将该功能作为抽象函数放入基类中。Car
类可以有一个方法virtual bool has_electric_engine(void) const = 0;
。CCD_ 14和CCD_ 15将返回CCD_。
请不要将虚拟相等方法制作成基类,因为代码将比较属性,但您确实希望比较类型。在该示例中,Mustang
汽车并不具有与Model_T
相同的所有属性。通常,如果你需要比较类型,你的设计是有缺陷的。
- 使用基类中的派生方法运行线程,而无需使用模板
- 使用回调函数从构造函数调用虚拟/派生方法的替代方法?
- 无法实例化抽象类,但类不是抽象/派生方法的参数
- 使用库中的基础级别中的派生方法
- 如何通过功能指针调用派生方法
- C++ shared_ptr从派生方法返回此值
- C 基本方法称为而不是派生方法
- 可视化C++对象被上投射到基类;无法调用派生方法
- C++ 继承函数指针,可与派生方法一起使用
- 基本方法被调用而不是派生方法
- 正在调用基方法,而不是从构造函数派生方法
- 具有显式派生方法的C++接口
- 正在调用派生方法而不是Base
- 继承方法,派生方法调用的不是基
- 使用不在基类中的派生方法
- 如何使用基指针访问派生方法
- 是否可以显式使用祖先的虚拟类方法作为派生方法?
- 中的派生方法未在基类中调用
- 从基指针调用派生方法
- 从基类调用基类中不存在的派生方法