正确设计避免使用Dynamic_Cast

时间:2017-06-29 21:37:05

标签: c++ inheritance polymorphism

我遇到的问题与此处提出的问题非常相似: Using derived methods that aren't in the base class

在那个问题中,由IdeaHat提供的最佳答案是使用dynamic_cast,但他/她继续说,如果你不得不诉诸于此,那么你的设计是糟糕的。我在其他问题中发现了非常相似的答案。

那么,在这种情况下,适当的设计是什么?

为了便于讨论,请使用此代码:

enum AnimalType {
    dog = 0,
    cat
}

Class Animal {
    virtual AnimalType getType() = 0;

    void eat() {
        cout << "Ate some food!" << endl;
    }

    void sleep() {
        cout << "Zzzz..." << endl;
    }
};

Class Dog : public Animal {
    AnimalType getType() {
        return AnimalType::dog;
    }

    void fetch() {
        cout << "Fetched the stick!" << endl;
    }
};

Class Cat : public Animal {
    AnimalType getType() {
        return AnimalType::cat;
    }
};

//A factory function
Animal* shelter(AnimalType type) {
    if(type == AnimalType::dog) {
        return new Dog;
    }
    else {
        return new Cat;
    }

int main() {
    Animal* pet = shelter(AnimalType::dog);

    pet->fetch();
}

基本上,我有一个工厂生产特定类的多个子类。一些子类包含父/其他子类中不存在的函数,如果没有解决方法,这将阻止使用多态。

我如何以一种有效的方式实现这一点,并且也会被认为是好的设计&#34;?

1 个答案:

答案 0 :(得分:1)

易:

void functionTakingAnimal(Animal& a) {
    a.eat();
    a.sleep();
}

int main() {
    Dog pet;
    pet.fetch();
    functionTakingAnimal(pet);
}

请勿在您需要之前销毁静态类型信息