C++中的多态(一)
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;}
};
- override: 检查派生类虚函数是否重写了基类某个虚函数,如果没有重写编译报错
class Car{public:virtual void Drive(){}
};class Benz :public Car {public:virtual void Drive() override {cout << "Benz-舒适" << endl;}
};
- 重载、覆盖(重写)、隐藏(重定义)的对比
三、抽象类
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++中的多态(一)相关推荐
- java中的多态_Java中的多态
多态与HoFs 朋友们好久不见啊,最近笔者同时在写脚本型语言--JavaScript,和工业级的面向对象语言--Java. 在写代码的同时呢,也会思考这些语言的不同.今天就拿 Java 中的多态,来谈 ...
- 何为Java 中的多态?
Java 中的多态一般分为两种:重写式多态和重载式多态. 重载式多态,也叫编译时多态.也就是说这种多态再编译时已经确定好了.重载大家都知道,方法名相同而参数列表不同的一组方法就是重载.在调用这种重载的 ...
- python 多态_Python中的多态
面向对象的语言有四个特性,抽象.封装.继承和多态.在之前的文章中,给小伙伴们已经讲解了前三个.为什么要把多态放在最后一个讲呢?因为前面的三个特性是多态的基础,了解了前三个,了解多态就很容易啦~ 那么, ...
- java多态 降低代码耦合性_深度分析:理解Java中的多态机制,一篇直接帮你掌握!...
Java中的多态 1 多态是什么 多态(Polymorphism)按字面的意思就是"多种状态".在面向对象语言中,接口的多种不同的实现方式即为多态.用白话来说,就是多个对象调用同一 ...
- java泛型类指定多个泛型_Java泛型中的多态
java泛型类指定多个泛型 从作为Java程序员的早期开始,我们都知道如何实例化和使用Collection对象. 实例化为具体类的List接口将如下所示. List myArrayList = new ...
- Java泛型中的多态
从作为Java程序员的早期开始,我们都知道如何实例化和使用Collection对象. 实例化为具体类的List接口将如下所示. List myArrayList = new ArrayList(); ...
- C++中对多态的理解
1 多态:是指类中具有相似功能的不同函数,使用同一个名称来实现:是对类的行为再抽象:多态是通过重载函数和虚函数来实现的. 2 继承讨论的是类与类的层次关系,多态则是考虑在不同层次的类中,以及在同一个类 ...
- java根据父类找子类_在java中实现多态时,可以通过父类变量引用子类的对象。_学小易找答案...
[单选题]对于字符串s="java",下面哪个选项返回字符在字符串中'v'的位置( ). [简答题]汽车核保的主要内容 [判断题]在java中产生子类对象时,直接调用子类的构造方法 ...
- java中实现多态的机制
多态性是面向对象程序设计代码重用的一个重要机制,我们曾不只一次的提到Java多态性.在Java运行时多态性:继承和接口的实现一文中,我们曾详细介绍了Java实现运行时多态性的动态方法调度:今天我们再次 ...
最新文章
- eclipse 将javaWeb项目转化成maven项目
- 信息竞赛进阶指南--最小表示法
- 线段树——操作格子(蓝桥杯试题集)
- cv_bridge 调用ros自带的opencv版本的解决
- 成为软件高手的几个忌讳(转贴)
- linux中rpm命令,linux中rpm命令使用介绍
- MarkDown快捷教程
- 在TMS320F28XXX DSP上实现从flash拷贝整个程序到ram运行的方法探讨
- python艺术签名_用 Python 制作一个艺术签名小工具,给自己设计一个优雅的签名...
- 同时新增一个订单与多个明细的方法
- 马哥教育SRE笔记【作业】week02
- UEFI 模式下重新安装系统注意事项
- C语言编程实现Euclid GCD算法 作业
- 深入解读RFM模型-实战应用干货
- 计算机网络知识全面讲解:理解网络协议
- 如何在element-plus配套vue3中使用日期时间选择器默认英文修改为中文
- pygame 等有缘人接盘
- Answer Set Programming 回答集编程
- 低成本创业必知的五个“基本点”
- jquery js 设置 div 的内容,给 div 添加一个属性