码迷,mamicode.com
首页 > 编程语言 > 详细

C++多态

时间:2017-10-20 21:34:04      阅读:265      评论:0      收藏:0      [点我收藏+]

标签:turn   执行   public   include   版本   使用   关键字   color   int   

1.多态按字面意思就是多种状态。当类之间存在层次结构,并且类之间是通过继承关联时,就会用到多态。

2.虚函数是C++实现多态的机制,核心理念就是通过基类访问派生类定义的函数

一、静态多态(静态链接)

如下的程序,class Book为基类,派生类class Book1,class Book2两个子类。

 1 #include <iostream>
 2 
 3 using namespace std;
 4 
 5 //基类
 6 class Book{
 7 public:
 8     int getbookname(void){
 9         cout << "基类调用!" << endl;
10         return 0;
11     }
12 };
13 //派生类
14 class Book1:public Book{
15     int getbookname(void){
16         cout << "派生类Book1调用!" << endl;
17         return 0;
18     }
19 };
20 //派生类
21 class Book2:public Book{
22     int getbookname(void){
23         cout << "派生类Book2调用!" << endl;
24         return 0;
25     }
26 };
27 
28 int main(void){
29     Book *book;
30     Book1 book1;
31     Book2 book2;
32 
33     book = &book1;
34     book->getbookname();
35 
36     book = &book2;
37     book->getbookname();
38 }

 

编译执行后,输出如下结果:

1 基类调用!
2 基类调用!

 

导致以上错误的原因是调用函数 getbookname() 被编译器设置为基类中的版本,这就是所谓的静态多态,或静态链接 - 函数调用在程序执行前就准备好了。

将基类定义作如下修改:

1 //基类
2 class Book{
3 public:
4     virtual int getbookname(void){
5         cout << "基类调用!" << endl;
6         return 0;
7     }
8 };

 

编译执行后,输出如下结果:

1 派生类Book1调用!
2 派生类Book2调用!

 

正如上所看到的,每个子类都有一个函数 area() 的独立实现。这就是多态的一般使用方式。有了多态,您可以有多个不同的类,都带有同一个名称但具有不同实现的函数,函数的参数甚至可以是相同的。

二、虚函数

虚函数 是在基类中使用关键字 virtual 声明的函数。在派生类中重新定义基类中定义的虚函数时,会告诉编译器不要静态链接到该函数。

我们想要的是在程序中任意点可以根据所调用的对象类型来选择调用的函数,这种操作被称为动态链接,或后期绑定

三、纯虚函数

您可能想要在基类中定义虚函数,以便在派生类中重新定义该函数更好地适用于对象,但是您在基类中又不能对虚函数给出有意义的实现,这个时候就会用到纯虚函数。纯虚函数声明如下:

1 virtual void function()=0;

 

= 0 告诉编译器,函数没有主体,上面的虚函数是纯虚函数

C++多态

标签:turn   执行   public   include   版本   使用   关键字   color   int   

原文地址:http://www.cnblogs.com/ivan0512/p/7701169.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!