在C ++中,此模型的最佳继承层次是什么?

时间:2019-03-05 12:35:10

标签: c++ class inheritance derived-class dynamic-binding

enter image description here 我将上述类模型作为DLL导出到用户。考虑到用户的方便,他们只需要实例化一个Base指针,并使用setMode(Mode)来初始化Tank或Truck对象。由于他们随时只需要一辆坦克或卡车,因此他们也可以使用setMode(Mode)重用指针并初始化新的坦克或卡车。

坦克只能有佳能,卡车只能有枪。

setMode(Mode)将分别初始化车辆类别中的武器。 setMode(Mode)看起来像这样(请暂时忽略指针内存问题):

void Vehicle::setMode(Mode mode){
    this->mode = mode;
    if(mode == Tank){
        weapon = new Canon("owner");
    }else{
        weapon = new Gun("owner");
    }
}

我的目的是为了简化用户,他们只需要了解Vehicle和Weapon基本类,以便他们使用Base Vehicle类并调用getWeapon(Weapon *)获得Base Weapon类,并加载武器并将其放回车辆。像这样:

//In case of Tank
Vehicle *vehicle = new Vehicle;
vehicle->setMode(Mode::Tank);
Weapon *weapon = vehicle->getWeapon();
weapon->setColor("red"); //Canon only function
weapon->reload();
vehicle->setWeapon(weapon);
vehicle->fire();

但是,正如您所见,因为它是基指针,所以它不能调用派生类的setColor(String)函数,因此我将所有佳能和Gun特定的函数作为空虚函数放在基类中。

class Weapon{
    public:
        /*others as usual*/

    virtual setColor(String){} //Canon
    virtual setBullets(int){}  //Gun
}

但这似乎是错误的,佳能无法setBullets()和Gun无法setColor(),但是并不能阻止用户在武器指针中获取佳能对象并调用setBullets()函数。

什么是更安全,更合适的课堂模型?

0 个答案:

没有答案