C++多态

c++多态
问题前瞻:

  1. 什么情形下会考虑使用多态?
  2. 使用多态编程可以有什么便利性?
  3. 多态特性怎么实现?
    1.1 多态特性
    多态是面向对象编程的三大特性之一。其余两个是继承性和封装性。
    用一句话来概括,多态就是同一函数(方法)作用于不同的对象时,可以有不同的解释,产生不同的执行结果。

1.2 使用多态编程的好处

在使用继承编程的时候,我们一般是把不同子类的方法分别写在不同子类中,使用的时候用is a 关键字来判断对象是哪种类型的,然后进行强制转换来使用不同对象的方法。
但是如果有多个子类的话,使用的时候难道要写多个if语句来判断对象是哪种类型(子类很多)吗?这样会产生很多冗余代码,也很繁琐。//怎么理解?
eg:
#include
using namespace std;

class Shape {
protected:
int width, height;
public:
Shape( int a=0, int b=0)
{
width = a;
height = b;
}
int area()
{
cout << “Parent class area :” <<endl;
return 0;
}
};
class Rectangle: public Shape{
public:
Rectangle( int a=0, int b=0):Shape(a, b) { }
int area ()
{
cout << “Rectangle class area :” <<endl;
return (width * height);
}
};
class Triangle: public Shape{
public:
Triangle( int a=0, int b=0):Shape(a, b) { }
int area ()
{
cout << “Triangle class area :” <<endl;
return (width * height / 2);
}
};
// 程序的主函数
int main( )
{
Shape *shape;
Rectangle rec(10,7);
Triangle tri(10,5);

// 存储矩形的地址
shape = &rec;
// 调用矩形的求面积函数 area
shape->area();

// 存储三角形的地址
shape = &tri;
// 调用三角形的求面积函数 area
shape->area();

return 0;
}
结果如下:
Parent class area
Parent class area
出错原因是,调用函数area()被编译器设置为了基类中的版本,这就是所谓的静态多态,或者静态链接。函数调用在程序执行前就准备好了。有时候也称为 早绑定 。因为area()函数在程序编译期间就已经设置好了。

那么多态是怎么克服这些繁琐或者异常的呢?

现在,在shape类中,area()的声明前放置关键字virtual,如下所示:
class Shape {
protected:
int width, height;
public:
Shape( int a=0, int b=0)
{
width = a;
height = b;
}
virtual int area()
{
cout << “Parent class area :” <<endl;
return 0;
}
};

修改后将正常执行。
发生了什么改进呢?此时,编译器看的是指针的内容,而不是它的类型。因此,由于tri和rec类的对象地址存储在*shape中,所以会调用各自的area()函数。
每个子类都有一个函数area()的独立实现。这是多态的一般使用方式。有了多态,您可以有多个不同的类,都带有同一个名称但具有不同实现的函数,函数的参数甚至可以是相同的。
具体该怎么解释牵涉到虚函数 静态链接等术语的定义。
答:虚函数是在基类中使用关键字virtual声明的函数。在派生类中重新定义基类中定义的虚函数时,会告诉编译器不要静态链接到该函数。
我们想要的是在程序中的任意点可以根据所调用的对象类型来选择调用的函数,这种操作被称为 动态链接,或者后期绑定。

纯虚函数:
什么时候用到 纯虚函数?不知道。
virtual int area() = 0;

总而言之,C++多态意味着调用成员函数时,会根据调用函数的对象的类型来执行不同的函数.

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值