C++学习之:虚函数

多态:

静态联编
  • 函数重载:用同一名字实现访问一组相关的函数
  • 运算符重载
  • 重载函数是通过“名字压延”方法来实现。即在编译时将函数名和参数结合起来创造一个新的函数名,用新的名字替换原有名字。
运行时多态性
  • 运行时多态性是指必须等到程序动态运行时才可确定的多态性,主要通过继承结合动态绑定获得。这与类的继承密切相关。因为存在类型的兼容性,所以有些函数只有在运行时才能确定是调用父类的还是子类的函数。在C++中,使用虚函数(Virtual Functions)来实现。

1.虚函数

 虚函数是在类定义中的函数原型声明前加一个关键字virtual。在派生类中重新定义时,它的函数原型(包括返回类型,函数名,参数个数和参数类型)必须与基类中的虚函数完全相同,否则编译器会认为派生类有两个重载函数。
当把一个函数定义为虚函数时,等于告诉编译器,这个成员函数在派生类中可能有不同的实现。必须在执行时根据传递的参数来决定调用哪一个函数。
派生类在对基类的虚函数重定义时,关键字virtual可以写也可以不写。不管virtual写或者不写,该函数都被认为是虚函数。但最好是在重定义时写上virtual。

2.虚析构函数

构造函数不能是虚函数,但析构函数可以是虚函数,而且最好是虚函数
如果派生类新增加的数据成员中含有指针,指向动态申请的内存,那么派生类必须定义析构函数释放这部分空间。但如果派生类的对象是通过基类的指针操作的,则delete基类指针指向的对象就会造成内存泄漏。使用虚析构函数就可以解决内存泄漏的问题。
和其他的虚函数一样,析构函数的虚函数的性质将被继承。派生类的析构函数在执行时会自动调用基类的析构函数,因此基类和派生类的析构函数都被执行,这样就把派生类的对象完全析构,而不是只析构派生类中的基类部分了。
如果继承层次树中的根类的析构函数是虚函数的话,所有派生类的析构函数都将是虚函数。

3.纯虚函数

纯虚函数:是一个在基类中说明的虚函数,它在该基类中没有定义,但要在它的派生类里定义自己的版本,或重新说明为纯虚函数
纯虚函数的一般形式
virtual 类型 函数名(参数表)=0

class shape{
  protected: 
    double x, y;
  public: 
     shape(double xx, double yy) {x=xx; y=yy;}
       virtual double area() = 0virtual void display() 
   {cout << "This is a shape. The position is (" 
     << x << ", " << y << ")\n";}
}; 

4.抽象类

如果一个类中至少有一个纯虚函数,则该类被称为抽象类
抽象类只能作为其他类的基类,不能建立抽象类的对象。因为一旦对此对象调用纯虚函数,该函数将无法执行。但是可以声明指向抽象类的指针或引用,此指针可指向它的派生类,进而实现多态性
抽象类不能用作参数类型、函数返回类型或显式转换类型
如果派生类中给除了基类所有纯虚函数的实现,则该派生类不再是抽象类,否则仍为抽象类

抽象类的意义:
1.作为基类,实现运行时的多态性.
2.保证进入继承层次的每个类都具有纯虚函数所要求的行为,这保证了围绕这个继承层次所建立起来的软件系统能正常运行,避免了这个继承层次的用户由于偶尔的失误(忘了为它所建立的派生类提供继承层次所要求的行为)而影响系统正常运行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值