C++中的多态(一)

文章目录

  • C++中的多态(一)
    • 一、多态的概念
    • 二、虚函数重写
    • 三、抽象类

一、多态的概念

1.多态的概念通俗来说,就是多种形态,具体点就是去完成某个行为,当不同的对象去完成时会产生出不同的状态。(即同一事物在不同场景下的不同形态)

2.多态的定义和实现条件:

a. 必须通过基类的指针或者引用调用虚函数

b. 被调用的函数必须是虚函数,且派生类必须对基类的虚函数进行重写

二、虚函数重写

1.虚函数:即被virtual修饰的类成员函数称为虚函数。

2.虚函数重写:虚函数的重写(覆盖):派生类中有一个跟基类完全相同的虚函数(即派生类虚函数与基类虚函数的返回值类型、函数名字、参数列表完全相同),称子类的虚函数重写了基类的虚函数。

class Person {public:virtual void BuyTicket() { cout << "买票-全价" << endl; }
};class Student : public Person {public:virtual void BuyTicket() { cout << "买票-半价" << endl; }
/*注意:在重写基类虚函数时,派生类的虚函数在不加virtual关键字时,虽然也可以构成重写(因为继承后
基类的虚函数被继承下来了在派生类依旧保持虚函数属性),但是该种写法不是很规范,不建议这样使用*/
/*void BuyTicket() { cout << "买票-半价" << endl; }*/
};void Func(Person& p)
{ p.BuyTicket();
}int main()
{Person ps;Student st;Func(ps);Func(st);return 0;
}

3.虚函数重写的例外:

  • a.协变(基类与派生类虚函数返回值类型不同)

派生类重写基类虚函数时,与基类虚函数返回值类型不同。即基类虚函数返回基类对象的指针或者引用,派生类虚函数返回派生类对象的指针或者引用时,称为协变

class A
{};class B : public A
{};class Person {public:virtual A* f(){return new A;}
};class Student : public Person
{public:virtual B* f(){return new B;}
};
  • b.析构函数的重写(基类与派生类析构函数的名字不同)

如果基类的析构函数为虚函数,此时派生类析构函数只要定义,无论是否加virtual关键字,都与基类的析构函数构成重写,虽然基类与派生类析构函数名字不同。虽然函数名不相同,看起来违背了重写的规则,其实不然,这里可以理解为编译器对析构函数的名称做了特殊处理,编译后析构函数的名称统一处理成destructor

class Person {public:virtual ~Person(){cout << "~Person()" << endl;}
};class Student : public Person {public:virtual ~Student() { cout << "~Student()" << endl; }
};// 只有派生类Student的析构函数重写了Person的析构函数,下面的delete对
//象调用析构函数,才能构成多态,才能保证p1和p2指向的对象正确的调用析构函数。
int main()
{Person* p1 = new Person;Person* p2 = new Student;delete p1;delete p2;return 0;
}

4.关键字:
1. final:修饰虚函数,表示该虚函数不能再被继承

class Car
{public:virtual void Drive() final {}
};class Benz :public Car
{public:virtual void Drive() {cout << "Benz-舒适" << endl;}
};
  1. override: 检查派生类虚函数是否重写了基类某个虚函数,如果没有重写编译报错
class Car{public:virtual void Drive(){}
};class Benz :public Car {public:virtual void Drive() override {cout << "Benz-舒适" << endl;}
};
  1. 重载、覆盖(重写)、隐藏(重定义)的对比

三、抽象类

1.概念:在虚函数的后面写上 =0 ,则这个函数为纯虚函数。包含纯虚函数的类叫做抽象类(也叫接口类),抽象类不能实例化出对象。派生类继承后也不能实例化出对象只有重写纯虚函数,派生类才能实例化出对象。纯虚函数规范了派生类必须重写,另外纯虚函数更体现出了接口继承

2.举例:

class Car
{public:virtual void Drive() = 0;
};class Benz :public Car
{public:virtual void Drive(){cout << "Benz-舒适" << endl;}
};class BMW :public Car
{public:virtual void Drive(){cout << "BMW-操控" << endl;}
};void Test()
{Car* pBenz = new Benz;pBenz->Drive();Car* pBMW = new BMW;pBMW->Drive();
}

C++中的多态(一)相关推荐

  1. java中的多态_Java中的多态

    多态与HoFs 朋友们好久不见啊,最近笔者同时在写脚本型语言--JavaScript,和工业级的面向对象语言--Java. 在写代码的同时呢,也会思考这些语言的不同.今天就拿 Java 中的多态,来谈 ...

  2. 何为Java 中的多态?

    Java 中的多态一般分为两种:重写式多态和重载式多态. 重载式多态,也叫编译时多态.也就是说这种多态再编译时已经确定好了.重载大家都知道,方法名相同而参数列表不同的一组方法就是重载.在调用这种重载的 ...

  3. python 多态_Python中的多态

    面向对象的语言有四个特性,抽象.封装.继承和多态.在之前的文章中,给小伙伴们已经讲解了前三个.为什么要把多态放在最后一个讲呢?因为前面的三个特性是多态的基础,了解了前三个,了解多态就很容易啦~ 那么, ...

  4. java多态 降低代码耦合性_深度分析:理解Java中的多态机制,一篇直接帮你掌握!...

    Java中的多态 1 多态是什么 多态(Polymorphism)按字面的意思就是"多种状态".在面向对象语言中,接口的多种不同的实现方式即为多态.用白话来说,就是多个对象调用同一 ...

  5. java泛型类指定多个泛型_Java泛型中的多态

    java泛型类指定多个泛型 从作为Java程序员的早期开始,我们都知道如何实例化和使用Collection对象. 实例化为具体类的List接口将如下所示. List myArrayList = new ...

  6. Java泛型中的多态

    从作为Java程序员的早期开始,我们都知道如何实例化和使用Collection对象. 实例化为具体类的List接口将如下所示. List myArrayList = new ArrayList(); ...

  7. C++中对多态的理解

    1 多态:是指类中具有相似功能的不同函数,使用同一个名称来实现:是对类的行为再抽象:多态是通过重载函数和虚函数来实现的. 2 继承讨论的是类与类的层次关系,多态则是考虑在不同层次的类中,以及在同一个类 ...

  8. java根据父类找子类_在java中实现多态时,可以通过父类变量引用子类的对象。_学小易找答案...

    [单选题]对于字符串s="java",下面哪个选项返回字符在字符串中'v'的位置( ). [简答题]汽车核保的主要内容 [判断题]在java中产生子类对象时,直接调用子类的构造方法 ...

  9. java中实现多态的机制

    多态性是面向对象程序设计代码重用的一个重要机制,我们曾不只一次的提到Java多态性.在Java运行时多态性:继承和接口的实现一文中,我们曾详细介绍了Java实现运行时多态性的动态方法调度:今天我们再次 ...

最新文章

  1. eclipse 将javaWeb项目转化成maven项目
  2. 信息竞赛进阶指南--最小表示法
  3. 线段树——操作格子(蓝桥杯试题集)
  4. cv_bridge 调用ros自带的opencv版本的解决
  5. 成为软件高手的几个忌讳(转贴)
  6. linux中rpm命令,linux中rpm命令使用介绍
  7. MarkDown快捷教程
  8. 在TMS320F28XXX DSP上实现从flash拷贝整个程序到ram运行的方法探讨
  9. python艺术签名_用 Python 制作一个艺术签名小工具,给自己设计一个优雅的签名...
  10. 同时新增一个订单与多个明细的方法
  11. 马哥教育SRE笔记【作业】week02
  12. UEFI 模式下重新安装系统注意事项
  13. C语言编程实现Euclid GCD算法 作业
  14. 深入解读RFM模型-实战应用干货
  15. 计算机网络知识全面讲解:理解网络协议
  16. 如何在element-plus配套vue3中使用日期时间选择器默认英文修改为中文
  17. pygame 等有缘人接盘
  18. Answer Set Programming 回答集编程
  19. 低成本创业必知的五个“基本点”
  20. jquery js 设置 div 的内容,给 div 添加一个属性

热门文章

  1. 200815-C指针高级和链表
  2. jQuery Css方法
  3. Dump文件:线程dump和堆dump
  4. vue.js的一些小语法v-bind,v-if,v-show,v-else
  5. 俩虚拟机间通过ssh互相登陆
  6. Linux改变进程优先级的nice命令
  7. 新手站长必须养成的五个好习惯
  8. 《Genesis-3D游戏引擎系列教程-入门篇》五:脚本
  9. Oracle DBA之配置静态监听(listener registered statically)
  10. 基于“证书”的Ipsec的传输模式