最近我在一次采访中被问到这个非常基本的问题。
为什么我们需要虚函数或多态?
我从实时项目中给出了各种答案,解释了它的工作原理但无法回答与需求有关的基本问题。 我的问题是(或他的qns是)
我反正要做下面的事情来调用相应的函数:
<base class> b = new <derived class>;
b.foo();
//can also be implemented as
<derived class> d = new <derived class>();
d.foo();
以上不是运行时决定,正如我在编写代码时所知,我将把哪种类型的派生对象放入基础。以上也可以如上所示直接实现。那么为什么要虚拟?
答案 0 :(得分:2)
一个非常简单的示例表明,对于根据运行时参数运行的对象,您需要虚函数(或一般的多态)。
animal* cute = nullptr;
animal_type type = get_animal_type_from_user_input();
// ^ Value depends on user input at runtime, unless we have some crystal ball
// or time machine, we won't know what type of animal it would be
if(type == cat) {
cute = new cat;
}
else if(type == dog) {
cute = new dog;
}
cute->fuss(); // Depends if cat or dog; we won't know until runtime
答案 1 :(得分:1)
当您希望使用子类在运行时通过基类的指针覆盖基类中方法的行为时,需要使用虚函数。非常好的例子/样本:
答案 2 :(得分:0)
各种形式的多态性允许相同(更高级别的客户端/算法)代码处理不同类型的数据。例如,为可以存储任何类型的数据的容器编写代码,或者对任何类型的容器进行排序,或者为任何类型的员工或承包商计算工资。运行时多态性(虚函数)允许您在数据直到运行时才知道。