虚函数与多态总结

一、基础知识

1、多态性的基本概念

多态性是指一个名字多种语义,或界面相同多种实现

重载函数是多态性的一种简单形式

虚函数允许函数调用与函数体的联系在运行时才进行,称为动态联编

2动态联编

(1)虚函数和基类指针

写有关键字virtual的成员函数称为虚函数,实现运行多态的关键是要说明虚函数,另外必须用基类指针调用派生类的不同实现版本。


注意:

一个虚函数,在派生类层界面相同的重载函数都保持虚特性

虚函数必须是类的成员函数

不能将友元说明为虚函数,但虚函数可以是另一个类的友元

析构函数可以是虚函数,但构造函数不行

(2)虚函数的重载特性

在派生类中重载基类的虚函数要求函数名、返回类型、参数个数、 参数类型和顺序完全相同, 如果仅仅返回类型不同, C++ 认为是错误重载, 如果函数原型不同,仅函数名相同,丢失虚特性 

(3)、虚析构函数

构造函数不能是虚函数。建立一个派生类的对象时,必须从类的层次的根开始,沿着继承路径逐个调用基类的构造函数

析构函数可以是虚的。虚析构函数用于指引delete运算符正确析构动态对象

(4)注意:

必须首先在基类中定义虚函数。

派生类对基类中声明虚函数重新定义时,关键字virtual可以不写。

一般通过基类指针访问虚函数时才能体现多态性。

一个虚函数无论被继承多少次,保持其虚函数特性。

虚函数必须是其所在类的成员函数,而不能是友元函数,也不能是静态函数。

构造函数、内联成员函数、静态成员函数不能是虚函数。

3、纯虚函数和抽象类

不对虚函数做定义,而把它声明为纯虚函数,它的实现留给该基类的派生类去做,这是纯虚函数的作用

纯虚函数是一个在基类中说明的虚函数,在基类中没有定义, 要求任何派生类都定义自己的版本,纯虚函数为各派生类提供一个公共界面
纯虚函数说明形式:
virtual  类型  函数名(参数表)= 0 ;

一个具有纯虚函数的基类称为抽象类
例:
  1. #include<iostream>
  2. using namespace std ;
  3. class Number
  4. { public : Number ( int i) { val = i ; }
  5. virtual void Show() = 0 ;
  6. protected: int val ;
  7. };
  8. class Hex_type : public Number
  9. { public: Hex_type( int i) : Number(i) { }
  10. void Show() { cout << "Hexadecimal:" << hex << val << endl ; }
  11. };
  12. class Dec_type : public Number
  13. { public: Dec_type( int i) : Number(i) { }
  14. void Show() { cout << "Decimal: " << dec << val << endl ; }
  15. };
  16. class Oct_type : public Number
  17. { public: Oct_type( int i) : Number(i) { }
  18. void Show() { cout << "Octal: " << oct << val << endl ; }
  19. }; 
  1. void fun( Number & n ) // 抽象类的引用参数
  2. { n.Show() ; } 
  3. int main()
  4. { Dec_type n1(50);
  5. fun(n1); // Dec_type::Show()
  6. Hex_type n2(50);
  7. fun(n2); // Hex_type::Show()
  8. Oct_type n3(50);
  9. fun(n3); // Oct_type::Show()
  10. }

二:心得体会
直接利用基类指针访问同名成员,通过配合虚函数才能实现覆盖,可以达到多态性的目的。
多态的关键:一切指向基类的指针或者引用来操作对象。
多态分为:类的多态性和函数多态性;多态即用父类型的指针指向子类对象,通过父类指针,调用子类的成员函数,父类指针具有多态。

在多态使用时,如果多态中,子父类出现同名变量、同名静态方法时,调用时只看引用。同名静态函数只看实体

有了多态使得对象的调用变得简单,不用再每个对象每个对象的去调用,而是一次性调用所有对象去执行。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值