采用虚函数实现运行时多态
在面向对象设计中,运行时多态通常是通过虚函数来实现的。使用dynamic_cast可以实现类型安全的向下转型,但是因为其效率较低,也容易在设计中引入复杂性和耦合性。因此,可以通过重构代码,将多态性纳入到基类和子类中,避免使用dynamic_cast。
例如,我们有一个基类Animal和它的两个子类Dog和Cat。之前可能使用了dynamic_cast来区分Dog和Cat类型:
class Animal {
public:
virtual ~Animal() {}
};
class Dog : public Animal {
public:
void bark() {}
};
class Cat : public Animal {
public:
void meow() {}
};
void talk_to_animal(Animal& animal) {
if (Dog* dog = dynamic_cast(&animal)) {
dog->bark();
} else if (Cat* cat = dynamic_cast(&animal)) {
cat->meow();
}
}
现在可以将bark和meow函数作为虚函数,让Dog和Cat类自行实现多态性:
class Animal {
public:
virtual ~Animal() {}
virtual void talk() = 0;
};
class Dog : public Animal {
public:
void talk() override {
bark();
}
void bark() {}
};
class Cat : public Animal {
public:
void talk() override {
meow();
}
void meow() {}
};
void talk_to_animal(Animal& animal) {
animal.talk();
}
这样做的好处是,如果以后有更多的Animal子类,talk_to_animal函数就不用再添加相应的if判断。同时,这种方式也更符合面向对象设计中的'开闭原则”。
下一篇:避免使用else和额外的嵌套