一、什么是多态?

多态的概念:多种形态。一千个人看《哈姆雷特》,就会有一千个哈姆雷特;这里的人就像对应是C++里的对象。

二、如何定义多态?

1、构成多态的俩个条件:
**···**调用函数的对象必须是指针或者引用。
**···**被调用的函数必须是虚函数,且完成了虚函数的重写。
2、定义

class Person
{public:virtual void Print(){cout << "我是李梅" << endl;}
};class Student : public Person
{public:virtual  void Print(){cout << "我是王维" << endl;}
};void Func(Person & people)
{people.Print();
}
int main()
{Person L; Func(L);//对象L输出李梅Student W;Func(W);//对象W输出王维system("pause");return 0;
}

运行结果如下:

通过上面的例子我们可以知道当不同对象,去调用同一命令时产生不同现象就是多态。

三、怎么使用多态?

1、什么是虚函数?
就是在类的成员函数的前面加 virtual 关键字

class Student : public Person
{public:virtual  void Print(){cout << "我是王维" << endl;}
};

2、什么是虚函数的重写?
虚函数的重写:派生类中有一个跟基类的完全相同虚函数,我们就称子类的虚函数重写了基类的虚函数,完全相同是指:函数名、参数、返回值都相同。另外虚函数的重写也叫作虚函数的覆盖。

class Person
{public:virtual void Print(){cout << "我是李梅" << endl;}
};class Student : public Person
{public:virtual  void Print(){cout << "我是王维" << endl;}
};

3、重写注意的地方
**····**虚函数重写有一个例外:重写的虚函数的返回值可以不同,但是必须分别是基类指针和派生类指针或者基类引用和派生类引用。

class Person
{public:virtual int Print(){cout << "我是李梅" << endl;return 1;}
};class Student : public Person
{public:virtual  int Print(){cout << "我是王维" << endl;return 2;}
};

**···**在派生类中重写的成员函数可以不加virtual关键字,也是构成重写的,因为继承后基类的虚函数被继承下来了在派生类依旧保持虚函数属性,我们只是重写了它。不建议这样使用。

class Person
{public:virtual void Print(){cout << "我是李梅" << endl;}
};class Student : public Person
{public:void Print(){cout << "我是王维" << endl;}
};void Func(Person & people)
{people.Print();
}
int main()
{Person L;Func(L);Student W;Func(W);system("pause");return 0;
}

运行结果:

**···**基类中的析构函数如果是虚函数,那么派生类的析构函数就重写了基类的析构函数。这里他们的函数名不相同,看起来违背了重写的规则,其实不然,这里可以理解为编译器对析构函数的名称做了特殊处理,编译后
析构函数的名称统一处理成destructor,这也说明的基类的析构函数最好写成虚函数。

class Person
{public:virtual ~Person(){cout << "~Person()" << endl;}
};class Student : public Person
{public:virtual ~Student(){cout << "~Student" << endl;}
};int main()
{Person *p1 = new Person;Person *p2 = new Student;delete p1;delete p2;system("pause");return 0;
}

运行结果:

4、接口继承和实现继承
普通函数的继承是一种实现继承,派生类继承了基类函数,可以使用函数,继承的是函数的实现。虚函数的继承是一种接口继承,派生类继承的是基类虚函数的接口,目的是为了重写,达成多态,继承的是接口。所以如果不实现多态,不要把函数定义成虚函数。
5、什么是重虚函数?
在虚函数的后面写上 =0 ,则这个函数为纯虚函数。包含纯虚函数的类叫做抽象类(也叫接口类),抽象类不能实例化出对象。派生类继承后也不能实例化出对象,只有重写纯虚函数,派生类才能实例化出对象。纯虚函数规范了派生类必须重写,另外纯虚函数更体现出了接口继承。

class Person
{public:virtual void Print() = 0;
};class Student : public Person
{public:void Print(){cout << "我是王维" << endl;}
};int main()
{Person *p2 = new Student;p2->Print();system("pause");return 0;
}

试图:

注意 C++11提供了Final 和 override来修饰虚函数:
1.final 修饰基类的虚函数不能被派生类重写
2.override 修饰派生类虚函数强制完成重写,如果没有重写编译器会报错。

四、多态注意的地方?

1、下面的代码调用了几次构造函数?调用了几次析构函数?

class Person
{public:Person(){cout << "Person()" << endl;}virtual ~Person(){cout << "~Person()" << endl;}
};class Student : public Person
{public:Student(){cout << "Student()" << endl;}virtual ~Student(){cout << "~Student" << endl;}
};int main()
{Person *p1 = new Person;Person *p2 = new Student;delete p1;delete p2;system("pause");return 0;
}

视图:

new Person 时只需调用自己的构造函数即可,new Student 时需要先构造基类的然后在构造派生类的。delete p2时需要先析构派生类的然后再析构基类的。
2、inline函数可以是虚函数吗?
不可以,因为inline函数没有地址,无法把地址放到虚函数表中。
3、静态成员可以是虚函数吗?
不可以,因为静态成员函数没有this指针,使用类型::成员函数的调用方式无法访问虚函数表。
4、构造函数可以是虚函数吗?
不可以,因为对象中的虚函数表指针是在构造函数初始化列表阶段才初始化的。

捻深红尚透,谁信道、花亦通灵。多态相关推荐

  1. 专访《花亦山心之月》:朝夕光年首款自研国风手游有啥不一样?

    自从朝夕光年成立以来,他们的动态总是能引起外界的关注与讨论. 在发行方面,<航海王热血航线><RO仙境传说:新世代的诞生>分别在国内.国外收获了不错的成绩,至少从结果论来看,他 ...

  2. 花开记春,花落记秋,早已忘却岁月悠悠。曲终人散,花亦垂首,空留旧人昔日颜容。

    1.明明你都已经离开了这个城市.却还在期待着你能回来. 2.花开记春,花落记秋,早已忘却岁月悠悠.曲终人散,花亦垂首,空留旧人昔日颜容.

  3. 画论68 郑绩《梦幻居画学简明》

    [中国历代画论目录] 目录 卷一 山水总论 述古 论形 论忌 论笔 论墨 论景 论意 论皴 论树 论泉 论界尺 论设色 论点苔 论远山 论题款 论图章 卷二 人物总论 述古 论工笔 论意笔 论逸笔 论 ...

  4. 画论59 邹一桂《小山画谱》

    [中国历代画论目录] 目录 提要 卷上 八法四知 各花分别 取用颜色 卷下 末附 洋菊谱(有序) 花名三十六种 提要 <小山画谱>二卷,国朝邹一桂撰.一桂字小山,号让乡,无锡人.雍正丁未进 ...

  5. 书论99 康有为《广艺舟双楫》

    目录 叙目 原书第一 尊碑第二 购碑第三 体变第四 分变第五 说分第六 本汉第七 传卫第八 宝南第九 备魏第十 取隋第十一 卑唐第十二 体系第十三 导源第十四 十家第十五 十六宗第十六 碑品第十七 碑 ...

  6. PaddleNLP_基于seq2seq的对联生成

    知识点回顾 1.以下哪些场景涉及文本生成? A.机器翻译 B.垃圾邮件识别 C.智能写作 D.生成式文本摘要 答案 ACD 2.paddlenlp.datasets类和paddle.io.Datase ...

  7. 没有你 万般精彩皆枉然

    ​​没有你,万般精彩皆枉然.你,是栖息在某人心头之人,更是每一个无可替代的它.万物皆有灵,在不曾踟蹰的千里足迹下,觅得到:在大自然作家笔端浮游的辞藻间,看得透. <没有你 万般精彩皆枉然> ...

  8. 画论17 邓椿《画继》

    目录 序 卷一 圣艺 ○徽宗皇帝 卷二 卷三 ○轩冕才贤 ○岩穴上士 卷四 卷五 ○道人衲子 ○世胄(妇女.宦者附) 卷六 ○仙佛鬼神 ○人物传写 ○山水林石 ○花竹翎毛 卷七 ○畜兽虫鱼 ○屋木舟车 ...

  9. 画论56 恽格《南田画跋》

    画有用苔者,有无苔者.苔为草痕石迹,或亦非石非草.却似有此一片,便应有此一点.譬之人有眼,通体皆虚.究竟通体皆虚,不独在眼,然而离眼不可也. 文徵仲述古云:看吴仲圭画,当于密处求疏:看倪云林画,当于疏 ...

最新文章

  1. puppet完全攻略(一)puppet应用原理及安装部署
  2. Unity3D教程宝典之Web服务器篇:(第二讲)从服务器下载图片
  3. 神经分类行为中的引力与斥力
  4. tomcat 7连接池配置与使用
  5. Leetcode--738. 单调递增的数字
  6. 统计天数(洛谷-P1567)
  7. Mac 10.12下安装python3环境
  8. 记录PHP的执行时间
  9. Java性能优化权威指南-读书笔记(一)-操作系统性能监控工具
  10. Linux开机加载新内核,linux-kernel – 为什么加载内核地址,ramdisk在启动时很重要?...
  11. 分享四个无版权,高清的图片素材网站
  12. vue 使用html自带title属性 鼠标悬浮展示内容 修改其样式
  13. 热点速递 | 超过220家银行加入摩根大通区块链网络;全球IEO项目数已达50
  14. 常州一中训练试题泛做 Part 1
  15. 云:SD-WAN不断增长的驱动力
  16. python turtle画彩虹的代码_Python turtle画图库画姓名实例
  17. 如何激发孩子的想象力_如何激发孩子的创造力,想象力?
  18. mysql 节假日判断_sql 节假日判断(春节、中秋、国庆、周末等)
  19. 曹云金回应公式相声_疑砸挂曹云金?阎鹤祥封箱大典开玩笑要退社,郭德纲回复亮了!...
  20. Amoeba数据库代理 实现mysql读写分离

热门文章

  1. 海康威视NVR获取网络摄像头报警信息 C++ 实现
  2. 【Java】基本类型
  3. 财务年终总结怎么写?技巧在这里
  4. 九度1465:最简真分数
  5. 候选码,主码,外码,主属性,非主属性
  6. 芯片的设计流程和流片成本
  7. ue4 无效模拟选项:形体被设置为模拟物理,但启用碰撞不兼容
  8. 错误代码 invalid-signature 错误原因: 验签出错,建议检查签名字符串或签名私钥与应用公钥是否匹配
  9. 面向医学图像分析的深度学习研究方案
  10. 明明白白给XBOX 360建兴光驱刷LT2光驱固件