博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【C++】虚函数
阅读量:6942 次
发布时间:2019-06-27

本文共 1426 字,大约阅读时间需要 4 分钟。

来自:黄邦勇帅

 

1.注意不能把成员变量声明为虚有的,也就是说 virtual 关见字不能用在成员变量前面。

2.一般应使用基类指针来调用虚函数,如果用点运算符来调用虚函数就失去了它的意义.

3.重定义虚函数时不需再使用virtual 关见字,当然也可以继续标明 virtual 关见字

4.虚函数的类被称为多态类.C++使用虚函数支持多态性.

5.一旦将函数声明为虚函数,则不管它通过多少层继承,它都是虚函数

6.隐藏虚函数:如果基类定义了一个 虚函数 ,但派生类中 却定义了一个虚函数的重载板本,则派生类的这个版本就会把基类的虚函数隐藏掉,当使用基类 指针调用该函数时只能调用基类的虚函数,而不能调用派生类的重载版本,当用派生类的对象调用基类的 虚函数时就会出现错误了 ,因为基类的虚函数被派生类的重载版本隐藏了。

7.如果虚函数形参有默认值,那么派生类中的虚数的形参不论有无默认值,当用指针调用派生类中的虚函数时就会被基类的默认值覆盖,即派生类的 默认值不起作用。但用派生类的对象调用该函数时,就不会出现这种情况。

8.析构函数可以是虚函数,但构造函数不能

9.纯虚函数声明形式为 virtual 类型 函数名(参数列表)=0;注意后面的 等于0;

10.如果类至少有一个纯虚函数,则这个类就是抽象的。

11.任何派生类都必须实现纯虚函数的自已的版本. 如果不实现纯虚函数那么该类也是抽象类。

12.抽象类不能有对象,抽象类只能用作其它类的基类

13.仍然可以用抽象类声明一个指针,这个指针指向派生类对象.

14.虚函数虚拟特性是以层次结构的方式来继承的,例如C从B派生而且C中重定义了B中的虚函数,而D又从C派生且未重定义B中的虚函数,这时声明一个基类指针P,当P指向类D,并调用D中的虚函数时,由于D中未重定义虚函数他会调用基类中的虚函数版本,这时他会调用类C中的虚函数而不是类B中的虚函数,因为类C比类B更接近于类D.

 

对于第7点,例子如下:

#include
using namespace std;class A{public: virtual void fun(int i = 9) { cout << "A fun" << endl; x = i; } int x;};class B:public A{public: void fun(int i = 8) { cout << "B fun" << endl; x = i; }};int main(){ B b; B *pb = new B; A *pa = new B; b.fun(); cout << b.x << endl; // 8 cout << "-----------------" << endl; pb->fun(); cout << pb->x << endl; // 8 cout << "-----------------" << endl; pa->fun(); cout << pa->x << endl; // 9 这时,派生类虚函数里的参数默认值无效 cout << "-----------------" << endl; return 0;}

 

转载地址:http://apgjl.baihongyu.com/

你可能感兴趣的文章
序算法时间复杂度、空间复杂度分享
查看>>
初探16.3+React升级后的生命周期
查看>>
ES6新特性总结
查看>>
文件I/O
查看>>
es6 class
查看>>
spring cloud微服务分布式云架构(三)-服务消费者(Feign)
查看>>
Vue之computed(计算属性)详解get()、set()
查看>>
Java 集合系列05之 LinkedList详细介绍(源码解析)和使用示例
查看>>
GMQ交易平台重塑数字资产交易格局
查看>>
Python爬虫入门教程 22-100 CSDN学院课程数据抓取
查看>>
Parasoft C / C ++Test10.4.1发布!完全支持SEI CERT C ++安全编码标准!
查看>>
Markdown 简明语法
查看>>
区块链100讲:零知识证明算法之zkSNARKs
查看>>
SpringBoot2系列教程(一)简介及HelloWorld项目
查看>>
Blockathon(北京) shows blockchain is a global endeavor
查看>>
css实现文字过长显示省略号的方法
查看>>
《一叶》在任意网页开启实时弹幕, 聊天窗口, 留言板
查看>>
【c++】c++基本操作(day1程序)
查看>>
探索Spring系列(二)SpringMVC请求过程
查看>>
React-Native开发中常用的第三方控件持续更新
查看>>