虚拟函数和纯虚拟函数

(一)对虚拟函数的理解:

a.一种动态多态机制,可以被基类指针,基类引用,以及对象所调用

b.在基类中必须给出虚拟函数的实现代码,用virtual 关键字定义

c.在派生类中,可以重新定义此虚拟函数,也可以不定义(若不定义则继承基类的实现代码)

d.虚拟函数的接口不能再重新定义时改变(这意味着形参列表以及返回值类型必须完全一样,否则就不是虚拟函数了,而是其他函数,详细了解请移步另篇博客)

 如下图,将函数m()定义成普通的成员函数,我们得到以下结果:

 

 

将函数m()定义成虚拟函数,得到如下:

我们会发现,只有将m()定义成虚拟函数,在派生类中对基类的重置才起作用,这正是c++中动态多态的魅力。

 

(二)对纯虚拟函数的理解:

无函数体且初始化为0

 

(三)对抽象类的理解:

提到纯虚拟函数就不得不提抽象类,有纯虚拟函数的类是抽象类,那“抽象”二字作何理解?

a.抽象类不能实例化,也就是不能创建对象。例如,飞机起飞方式包括垂直起飞和长距离起飞,则起飞方式就是抽象基类,垂直起飞和长距离起飞就是派生类。抽象基类起飞方式它是一个笼统的概念,不能创建对象,但是派生类如垂直起飞和长距离起飞却可以。

b.抽象基类一般做接口使用。

c.若在继承类中没有重定义此纯虚拟函数,则继承类也是抽象类,在上述例子中,派生类中一定要重新定义基类中的纯虚拟函数,否则其也就被视为抽象类了。

class TakeOffBehavior {
public:
   virtual void takeOff() = 0; //纯虚拟函数,takeoff()做接口
   void fly() { cout << " Fly!\n ";  }
};

class VerticalTakeOff : public TakeOffBehavior {
public:	
   void takeOff() { cout << "Vertical TakeOff ! " << endl; } //重置了基类纯虚拟函数takeoff()
};

class LongDistanceTakeOff : public TakeOffBehavior {
public:	
   void takeOff (){ cout << "Long Distance TakeOff ! " << endl; }//重置了基类纯虚拟takeoff()

};

如下代码说明,抽象基类不能创建对象: 

 如下代码说明,派生类可以创建对象和纯虚拟函数做接口的实现:(分别实例化出垂直起飞和长距起飞的对象)

文章是作者对c++的学习心得,如果读者发现有错误之处或有疑惑的地方,可以在评论区留言,感谢您的批评指正!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值