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

做网站接广告赚钱吗0元入驻的电商平台

做网站接广告赚钱吗,0元入驻的电商平台,四川省人事考试网,免费发布信息网b2b一、多态的概念 1.1概念: 通俗来说,就是多种形态,具体点就是去完成某个行为,当不同的对象去完成时会产生出不同的状态。 二、 多态的定义及实现 2.1多态的构成条件 多态是在不同继承关系的类对象,去调用同一函数,产…

一、多态的概念

1.1概念:

通俗来说,就是多种形态,具体点就是去完成某个行为,当不同的对象去完成时会产生出不同的状态。

二、 多态的定义及实现

 2.1多态的构成条件

多态是在不同继承关系的类对象,去调用同一函数,产生了不同的行为。比如Student继承了Person。Person对象买票全价,Student对象买票半价。

在继承中要多态还要两个条件

  1. 父类指针或引用去调用虚函数,这样才能保证传父类对象调用的就是父类的虚函数,传子类对象,调用的是子类的虚函数(调用子类传子类利用切片的原理)
  2. 虚函数完成重写:父子类中的两个虚函数,三同(函数名、参数、返回值)这样父子类的两个虚函数才能构成重写

可以将重写理解为隐藏的子集,因为隐藏仅要求函数名相同

 2.2虚函数

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

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

2.3虚函数的重写

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

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(); }

2.4虚函数重写的两个例外:

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. 析构函数的重写(基类与派生类析构函数的名字不同)

普通调用:看指针或者引用或者对象的类型

多态调用:看指针或者引用指向的对象

我们希望上面的特殊情况是多态调用,如果是普通调用,会造成内存泄漏(student对象没有析构,如下图)。

所以我们如何才能变成多态调用呢?

在子类和基类的析构函数都加上virtual构成重写,变为多态调用。那这里违反重写的规则,函数名都不相同,怎么能构成重写呢?

答:

虽然函数名不相同,看起来违背了重写的规则,其实不然,这里可以理解为编译器对析构函数的名称做了特殊处理,编译后析构函数的名称统一处理成destructor

TIP:特殊情况

如果基类的析构函数为虚函数,此时派生类析构函数只要定义,无论是否加virtual关键字,都与基类的析构函数构成重写

2.5、关于父类子类virtual加与不加

虚函数重写时,父类虚函数加了virtual,子类不加,也构成重写;但是如果父类不加virtual,就不构成重写。

建议:两个虚函数都加上virtual

2.6 C++11 override 和 final

final 关键字的两个作用:

其一是final修饰的类是最终类,不能被继承

注意实现一个类,这个类不能被继承还有一种方法:让父类构造函数私有化,派生类实例化不出对象。

其二是修饰虚函数,表示该虚函数不能再被重写

override: 检查派生类虚函数是否重写了基类某个虚函数,如果没有重写编译就会报错。

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

重载:

  1. 两个函数在同一作用域
  2. 函数名相同,参数不同

重写(覆盖)

  1. 两个函数分别在基类和派生类的作用域
  2. 函数名/参数/返回值都必须相同(协变例外)
  3. 两个函数都必须是虚函数

重定义(隐藏)

  1. 两个函数分别在基类和派生类的作用域
  2. 函数名相同
  3. 两个基类和派生类的同名函数不构成重写就是重定义

四、多态的原理

4.1虚函数表

先做一道笔试题:

// 这里常考一道笔试题:sizeof(Base)是多少?
class Base
{
public:virtual void Func1(){cout << "Func1()" << endl;}
private:int _b = 1;
};

通过观察测试我们发现b对象是8bytes。

除了_b成员,还多一个__vfptr指针,也就是虚函数表指针,这个表本质上是一个函数指针的数组

vfptr是存放函数指针的数组,就是将虚函数的指针存进去。

虚函数的重写也叫做覆盖,重写是语法层的概念,覆盖是原理层的概念。

形象的记忆:

比如上图,子类将父类的拷贝过来,然后虚表重写的部分将原先父类虚表的部分进行一个覆盖

具体如何实现多态调用和普通调用?

  • 多态调用:

运行时去虚函数表中找函数的地址,进行调用,所以指向父类调用的是父类虚函数,指向子类调用的是子类虚函数。

  • 普通调用:

编译时,通过调用者类型确定函数地址。

面试题解析:

解析:

首先我们看到B继承A,那么B里面的func函数和A里面的func函数构不构成重写呢?

函数名相同,返回值相同,参数类型相同(注意看参数是否相同,就是看类型,与变量名、缺省值无关!)并且父类是虚函数,所以构成重写!

接着我们看到p->test(),直接调用到了父类test()里面的func()函数,那么这里this指针是A* or B*呢,因为此时的test()是在父类,因此是A*,(如果是B*子类,那就不满足多态的条件必须是父类,所以不满足多态)所以这里的func函数构成了多态,因此是多态调用,所以是指针/引用指向的类型,因此调用B里面的func函数,所以答案是D嘛?

但真正的答案是B。

原因是多态调用,重写是实现重写,会将父类的函数声明与子类进行组合,因此val的值就是父类的1,因此答案是B!

下面因为是子类的调用,不构成多态,因此答案全都是D

http://www.mmbaike.com/news/91994.html

相关文章:

  • dw自己做的网站手机进不去nba排行榜最新排名
  • 西宁设计网站建设安徽搜索引擎优化
  • 网上购物商城网站建设成都网络营销推广
  • 自己有网站怎么做点卡北京搜索引擎优化seo
  • 织梦网站怎么做301牛奶推广软文文章
  • WordPress两种列表页上海网站建设seo
  • 租车公司网站 模板广州网络推广外包
  • 最好的网站建设公司网页模板下载
  • 公安局网站建设请示传统营销
  • 网站建设 提案 框架seo案例
  • 淘宝可以在哪些网站上面打做推广南京seo域名
  • 学做淘宝网站是骗子吗百度搜索推广方案
  • 教育培训网站建设方案seo搜索优化工程师招聘
  • 用php做网站用到的工具域名注册商有哪些
  • 深圳高端网站建设公司seo公司资源
  • 山西太原建设厅官方网站怎么让百度搜出自己
  • 网站关键词在哪里做头条新闻今日头条
  • 网站建设公司中深圳市社会组织总会
  • 长春网站制作深圳网站开发技术
  • 哪个网络公司做网站好semifinal
  • 建一个类似亨物说网站建设费用编程培训机构
  • jq网站模板湛江百度网站快速排名
  • 免费网站建站塔山双喜seo白帽优化
  • 定西企业网站制作有了域名如何建立网站
  • 成都网站建设新网创想市场调研报告范文大全
  • 怎样收录网站线上销售的方法和技巧
  • wordpress 格式南昌seo排名扣费
  • 四川平昌县建设局网站网站建设是干嘛的
  • 做投标网站条件免费企业黄页查询官网
  • 从网站验证码谈用户体验百度关键词seo优化