一、动态绑定什么时候发生

当且仅当通过指针或引用调用虚函数时,才会在运行时解析该调用

二、派生类中的虚函数

当我们在派生类中覆盖了某个虚函数时,可以再一次使用virtual指出该函数的性质,但是这么做并非必须,因为一旦某个函数被声明成虚函数,则在所有派生类中它都是虚函数。

一个派生类的函数如果覆盖了某个继承而来的虚函数,则它的形参类型及返回类型必须与被它覆盖的基类函数完全一致,除非当类的虚函数返回类型是类本身的指针或引用时。

当派生类中某函数与基类的某虚函数名字及形参相同时,此时编译器认为派生类覆盖了这个函数,此时返回类型需一致,除非是上述情况,不然出错。若形参类型不同,这是两个不同的函数。

在c++11标准中我们可以使用override来说明派生类中的虚函数。如果我们使用override标记了某个函数,但该函数并没有覆盖已存在的虚函数,此时编译器将报错。注意:只有虚函数才能被覆盖,覆盖的作用是为了实现多态

class b
{
public:
virtual void f1(int)const;
virtual void f2();
void f3();
}; class d :public b
{
void f1(int) const override;//准确
void f2(int) override;//错误,形参不一致
void f3() override;//错误,f3不是虚函数
};

把某个函数指定为final,则之后任何尝试覆盖该函数的操作将引发错误。

class base
{
public:
virtual void f1(int)const final;
}; class derived :public base
{
public :
void f1(int)const;//出错,f1为final,无法覆盖
};

如果虚函数使用默认实参,则基类和派生类中定义的默认实参最好一致,因为会调用基类的默认实参,默认实参是静态绑定的(前提是通过基类的指针或引用来调用,如果是通过派生类的对象来调用该虚函数,使用的是派生类虚函数中的默认实参)

三、抽象基类

含有纯虚函数的类是抽象基类,我们不能创建抽象基类的对象,如果在抽象基类的派生类中覆盖了纯虚函数,则派生类可以创建对象,否则派生类仍然是抽象类

四、虚析构函数

继承关系对基类拷贝控制最直接的影响是基类通常应该定义一个虚析构函数。当我们delete一个动态分配的对象的指针时将执行析构函数,如果该指针指向继承体系中的某个类型,则有可能出现指针的静态类型与被删除对象的动态类型不符的情况,所以通过在基类中将析构函数定义为虚函数以确保执行正确的析构函数版本。

如果基类的析构函数不是虚函数,则delete一个指向派生类对象的基类指针将产生未定义的行为(可能造成内存泄漏,此时调用基类析构函数,而不是派生类析构函数),而且基类需要虚析构函数,此时并不一定需要拷贝和赋值操作。

最新文章

  1. jquery获取所选元素的outerHTML
  2. android Bitmap类方法属性 详细说明
  3. Spring BeanUtils的用法
  4. eBay 消息发送(2)
  5. SimpleDateFormat()简单了解
  6. 在CentOS6.4中安装配置LAMP环境的详细步骤
  7. ASP.NET MVC4(Razor)从客户端中检测到有潜在危险的 Request.Form 值
  8. Python 2.7.3的文件编码问题,print在控制台下面中文乱码问题,以及推荐做法
  9. SL.XNA中的Popup
  10. Html5-audio标签简介及手机端不自动播放问题
  11. ROS探索总结(十五)——amcl(导航与定位)
  12. OAuth2实现单点登录SSO
  13. Win10安装LoadRunner11
  14. JSP(7)—EL和JSTL
  15. apache 压力测试ab
  16. run `npm audit fix` to fix them, or `npm audit` for details
  17. Java对象与JSON互相转换jsonlib以及手动创建JSON对象与数组——(二)
  18. bsgs算法详解
  19. easyui datagrid设置fit: true后,页面显示不全的情况
  20. wpf expender 展开动画

热门文章

  1. mysql delete 表无法用别名
  2. kvm网络虚拟化管理
  3. 控制mysql数字转换
  4. [Redis]ResponseError: Client sent AUTH, but no password is set
  5. Django 千锋培训的学习笔记(2)
  6. Given a linked list, return the node where the cycle begins. If there is no cycle, returnnull. Follow up: Can
  7. layer2-1 二层
  8. POJ 2155 Matrix【二维线段树】
  9. Spring Boot SpringSecurity5 身份验证
  10. 二分图最小覆盖的Konig定理及其证明,最小的覆盖证明