当前位置: 首页 > news >正文

C++ 多态(1)

1.多态的定义

定义:不同的人做同一事情会产生不同的形态(比如说,买车票,学生七五折,成人全票......)

           就是在不同继承关系的类对象在调用同一函数时,产生不同的效果。

2.虚函数

2.1虚函数的定义

被virtual修饰的类成员函数叫做虚函数

class Person
{	
public:virtual void BuyTicket() { cout << "买票-》全票" << endl; }
};

2.2虚函数的重写(重写是一种特殊的隐藏)

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

class Person
{	
public:virtual void BuyTicket() { cout << "买票-》全票" << endl; }
};
class Student :public Person
{
public://以前在继承中说到过隐藏的概念,但是在多态中叫重写virtual void BuyTicket() { cout << "买票-》半价" << endl; }
};

这就是一个标准的多态行为

2.2.1虚函数重写的特例---协变(基类与派生类的返回值类型不同)

基类虚函数返回基类对象的指针或者引用,派生类虚函数返回派生类对象的指针或者引用
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; }
};

2.2.2析构函数的重写

规则:

  • 基类的析构函数必须加virtual(虚析构),才能让派生类的析构函数 “覆盖” 它。
  •  派生类的析构函数不用写virtual(但写了也没事),只要基类是虚析构,销毁时就会从子类到父类依次调用析构函数(先儿子后爸爸)。
  • 编译后析构函数的名称统一处理成destructor。
class Person {
public:virtual ~Person(){cout << "~Person" << endl;}
};
class Student:public Person 
{
public:~Student(){cout << "~Student" << endl;}
};
int main()
{//用父类的指针指向子类Person* p1 = new Student;delete p1;//会先调用父亲的析构,在调用儿子的析构return 0;
}

因此析构函数一定建议写成虚函数

2.3多态的条件(缺一不可)

  • 虚函数重写(虚函数是指被重写的函数是虚函数,要重写的函数不必是虚函数,但是建议都把virtual;其次,多态不一定非得是父类和子类,也可以是多个子类之间生成多态)
  • 父类指针或者引用调用虚函数

3.重载、覆盖(重写)、隐藏(重定义)的对比

  

多态调用,看指向者的类型,指向谁就调用谁的虚函数;

普通调用,看调用者的类型,调用调用者的函数;

4.c++11 override和final

  • final:修饰虚函数,表示改虚函数不能再被重写
class Car
{
public:virtual void Drive()final{}
};
class Benz :public Car
{
public://该Drive不能被重写virtual void Drive() { cout << 11 << endl; }
};

同理,如果一个类不想被继承,那么在类名之后也加final

class A final
{
};

或者可以将构造函数私有

class A
{
private:A(){}//这样派生类就无法生成对象了//因为我们规定派生类的构造函数必须依靠基类的构造函数
};
  • override:检查派生类虚函数是否重写了基类某个虚函数,如果没有重写,编译报错
class Car
{
public:virtual void Drive(){}
};
class Benz :public Car
{
public://virtual void Drive() override { cout << "苏轼" << endl; }
};

http://www.dtcms.com/a/496730.html

相关文章:

  • 中国空间站组成部分三门峡 网站开发
  • 监控运行大模型的显存占用率的方式
  • NumPy 快速入门
  • python-time和datetime
  • 东莞网站建设_东莞网页设计】最好看免费观看高清大全
  • vs 2017c 怎么建设网站WordPress图片加密
  • 力扣-删除重复的电子邮箱
  • Avalonia DataGrid 控件的LostFocus事件会多次触发
  • python做网站的优势wordpress 类似的
  • 58同城网站建设的不足网站建设顾问站建
  • CRMEB-PHP批量发货技术详解
  • 高扩展集群的实现方式:硬件与软件视角
  • 美妆企业网站模板企业购物网站开发
  • 行业网站解决方案营销网站制作公司
  • 常州网站推关键词排名规则
  • Prism框架下MVVM模式中命令实现
  • 外国人的做视频网站吗主流的网站开发框架
  • 微信网站什么做盐城网站优化工作室
  • 游戏设计网站深圳网络建设公司
  • 常德网站建设制作网站设计公司有用吗
  • 肘部法找k
  • 自助建站是什么意思邯郸网站建设优化
  • 优秀的网站通过什么提供信息合肥市门户网站
  • YooAsset运行机制
  • CC12-拆分词句
  • 室内设计网站参考手机能建设网站吗
  • 做网站宁波有什么的网络公司网页设计与制作公告栏
  • 直播美颜SDK功能开发实录:自然妆感算法、人脸跟踪与AI美颜技术
  • 建设网站怎么查明细想开广告公司怎么起步
  • Monkey 综合运用参考