这段时间先后学习了C++的重定义和多态。刚学多态的时候心里一直有个疑问:多态是同样的方法在不同的派生类中可以有不同的实现,重定义因为同名隐藏的机制也可以做到同样的方法在不同的派生类中可以有不同的实现。从功能上看多态似乎和重定义没啥区别,而且多态的开销还要更大些。为什么还要在引入多态这个概念呢。
下面我们就来 说一说多态所具备的独特的优势。
首先:
由于同名隐藏机制,只要在派生类中将方法重定义之后,基类中所有的同名方法我们都无法调用了。可能有人会说,既然已经选择重定义这个方法,基类中的方法也就没有调用的必要了。但是你可能忽视了一个概念:重载
如果基类中有三参数的方法和四参数的方法而派生类中只重定义了三参数的方法,基类四参数的方法我们就不能使用了,因为同名隐藏。
多态则没有这个缺陷:只需将想要重写的函数设为虚函数,基类的其他同名函数派生类依然可以调用
其次:
设想一下这样的情况:我们需要定义一个函数让其能够计算平面几何图形的面积:就是传进去什么图形计算什么图形的面积。
重定义固然可以实现不同的派生类有不同的getArea()方法,但我们没有方法或者方法很复杂来实现一个统一的接口来实现这样一个函数。下面这个代码是我们设想的逻辑可以看到getArea函数我们希望传进去一个Shape派生类的对象。但是如果用重定义这里只会输出一种结果:“shape”
class Shape{
public:
void getArea() {
cout<<"Shape"<<endl;
}
};
void getArea(Shape &p){
p.getArea();
}
如果我们用多态,这里就会成为一个统一的接口因为多态中派生类的虚函数表是从基类继承过来的,重写只是改变了虚函数表中的内容,基类的指针可以访问这部分内容。
这个特性无疑是非常强大方便的,这也是我认为多态最牛逼的地方,他统一了接口,重定义和重载(静态多态)就是一种代码的优化,增强可读性,我认为没有什么太大的意义。
class Shape{
public:
virtual void getArea() {
cout<<"Shape"<<endl;
}
};
void getArea(Shape &p){
p.getArea();
}
文章参考了https://blog.csdn.net/qq_41936559/article/details/105291531