(一)对虚拟函数的理解:
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++的学习心得,如果读者发现有错误之处或有疑惑的地方,可以在评论区留言,感谢您的批评指正!