如何使用基指针访问派生方法

How would you access derived methods using a base pointer ?

本文关键字:派生 方法 访问 指针 何使用      更新时间:2023-10-16

我看过几篇关于这个主题的文章,但没有找到我想要的解决方案。很抱歉在一开始又重复了一次。但我想知道,面对下面给出的情况,你们这些专家会怎么做?

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_TTeslaHybridMustang,以及一个指向Car实例的指针,你不知道这个孩子是什么样的车。Model_T与电动Tesla不同。配备汽油发动机的Mustang与配备电动发动机和汽油发动机的Hybrid不同。

如果要使用基类指针访问功能,请将该功能作为抽象函数放入基类中。Car类可以有一个方法virtual bool has_electric_engine(void) const = 0;。CCD_ 14和CCD_ 15将返回CCD_。

请不要将虚拟相等方法制作成基类,因为代码将比较属性,但您确实希望比较类型。在该示例中,Mustang汽车并不具有与Model_T相同的所有属性。通常,如果你需要比较类型,你的设计是有缺陷的。