Неужели обрушение дауна наносит ущерб цели полиморфизма?

Сегодня я столкнулся с вопросом , найденным здесь , который поставил этот вопрос передо мной.

Вот псевдокодовый пример того, что я получаю на:

class Car{
public:
    virtual int goFast() = 0;
};


class FordFocus : public Car {
public:
    int goFast(){
        return 35;
    };
};


class Lamborghini : public Car {
    bool roof;
public:
    int goFast(){
        return -1/0;  // crash 
    };
    void retractTheRoof(){
        roof = 0;
    };
};



class RichGuy {
    vector cars;
public:
    void goDrive() {

        for(int i = 0; i < cars.size(); ++i) {
            if(Lamborghini* lambo = dynamic_cast(cars[i])) {
                lambo->retractTheRoof();
            };
            goFast();
        };
    };
};

В примере есть RichGuy класс. Richguy отслеживает только свои Cars в одном векторе. Поскольку у него так много Машин , было бы слишком сложно отслеживать их, основываясь на том, являются ли они FordFocus или Lamborghini. Однако, единственный тип автомобиля с выдвигающейся крышей - это Lambo. Для того, чтобы убрать TheRoof(), RichGuy теперь должен определить, действительно ли Car, который у него есть, является Lamboghini, а затем опустить, чтобы выполнить эту функцию этого автомобиля.

Основываясь на этом примере, был ли выбор в пользу понижения в хорошей конструкции? Или он нарушил цель полиморфизма, предполагая, что цель состоит в том, чтобы позволить производным классам определить свое собственное поведение, и обеспечить общий интерфейс для таких классов, как RichGuy? И если да, то есть ли лучший способ разрешить использование функций типа retractTheRoof() (или, по крайней мере, их эффект) в RichGuy?

17
задан Community 23 May 2017 в 12:06
поделиться