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

外汇直播网站建设开发百度打网站名称就显示 如何做

外汇直播网站建设开发,百度打网站名称就显示 如何做,旧版优化大师,网页界面设计赏析多态 前言多态的概念多态的定义及实现多态的构成条件虚函数虚函数的重写虚函数重写的两个例外协变(基类与派生类虚函数返回值类型不同)析构函数的重写 override和final 虚函数的默认参数 抽象基类 前言 在买火车票的时候,如果你是学生,是买半价票&#…

多态

  • 前言
  • 多态的概念
  • 多态的定义及实现
    • 多态的构成条件
    • 虚函数
    • 虚函数的重写
      • 虚函数重写的两个例外
        • 协变(基类与派生类虚函数返回值类型不同)
        • 析构函数的重写
      • override和final
    • 虚函数的默认参数
  • 抽象基类

前言

在买火车票的时候,如果你是学生,是买半价票;普通人是全家买票,军人买票是优先买票。

多态的概念

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

多态的定义及实现

多态的构成条件

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

必须通过基类的指针或者引用调用虚函数
被调用的函数必须是虚函数,切派生类必须对基类的虚函数进行重写

虚函数

继承中提到过虚继承,关键字是 virtual,这里的虚函数,是指virtual修饰的类成员函数称为虚函数。

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

虚函数的重写

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

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

当虚函数通过指针或者引用调用时,我们并不知道该函数真正作用的对象是什么类型,因为他可能是一个基类的对象也可能是一个派生类的对象,直到运行时才会决定到底执行哪个版本,判断依据是引用或指针所绑定的对象的真是类型。

当且仅当对通过指针或引用调用虚函数时,才会在运行时解析该调用,也只有在这种情况下对象的动态类型才有可能与静态类型不同。

所以上面的结果是 半价

在这里插入图片描述

虚函数重写的两个例外

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

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

在这里插入图片描述

我将上面的代码Student中的函数返回值改为int,就会产生协变。

如果我将基类的函数和派生类的函数都改成指针类型。
在这里插入图片描述

在这里插入图片描述

代码就能正常运行。

析构函数的重写

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

class Person
{
public:~Person(){cout << "~Person" << endl;}};class Student : public Person
{
public:~Student(){cout << "~Student" << endl;}};int main()
{Person* p = new Person;delete p;p = new Student;delete p;return 0;
}

在这里插入图片描述

执行了两次基类的析构函数,因为p的类型是基类的指针类型,所以在不重写的情况下,只能调用基类的析构函数,如果这个时候派生类里面涉及到动态内存等申请资源的函数,且最后并没有释放资源,就会造成内存泄漏。

override和final

如果把某个函数指定为 final,则之后任何尝试覆盖该函数的操作都将引发错误。

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

使用 override标记了某个函数,但该函数并没有覆盖已存在的虚函数,此时编译器将报错。

class B
{
public:virtual void f1(int) const;virtual void f2();void f3();
}class D : B
{
public:void f1(int) const override; 正确,f1跟基类中的f1匹配void f2(int) override; 错误,没有匹配参数void f3() override; 错误,f3不是虚函数void f4() override; 错误,B中没有名为f4的函数
}

在这里插入图片描述

虚函数的默认参数

和其他函数一样,虚函数也可以拥有默认参数。如果我们通过基类的引用或指针调用函数,则使用基类中定义的默认实参,即使实际运行的派生类中的函数版本也是如此。此时,传入派生类函数的将是基类函数定义的默认参数。如果派生类函数依赖不同的实参,则程序结果将于我们的预期不同。

如果虚函数使用默认参数,则基类和派生类中定义的默认实参最好一致。

class A
{
public:virtual void f(int a = 1){cout << "A::f()" << a << endl;}
};class B : public A
{
public:virtual void f(int a = 2){cout << "B::f()" << a << endl;}
};int main()
{B b;A* a = &b;a->f();return 0;
}

输出结果B::f()1

抽象基类

在虚函数的后面写上 =0则这个函数为纯虚函数。这样做可以告诉用户当前这个纯虚函数没有实际意思。一个纯虚函数无需定义,在函数体的位置写上 =0即可。这个 =0只能出现在类内部虚函数声明处。

class A
{
public:virtual void f() = 0;
};

含有纯虚函数的类是抽象基类。抽象基类负责定义接口,而后续的其他类可以覆盖该接口。抽象基类不能实例化出对象。派生类继承后也不能实例化出对象,只有重写虚函数,派生类才能实例化出对象。

http://www.yayakq.cn/news/93232/

相关文章:

  • 开一家网站建设公司wordpress 文章类型模板
  • 网站开发发展现状在中国怎么做国外网站
  • 哪些网站做的海报比较高大上检测设备技术支持东莞网站建设
  • 有道翻译网站 做翻译wordpress怎么改模版
  • 淘宝网站建设合同创建公司网站需要准备哪些素材
  • 做养生网站需要资质吗企业网站开发一般多少钱
  • 网站建设怎么建设企业网站排行
  • 织梦可以做相亲网站网站规划可以分成哪几步
  • 济南网站建设推广php网站开发是什么意思
  • 网站上传视频怎么做简单的公司网站系统
  • 建设注册管理中心网站如何建立一个网站的数据库文件
  • 做电脑网站用什么软件有哪些方面众筹网站怎么做
  • 网站怎么添加百度商桥花都网站建设
  • 专业网站优化软件设计师导航网站
  • 外贸常用网站建设眼镜网站风格
  • 网站建设 检查 通报绍兴seo排名
  • 宠物网站建设费用北京网站建设找德冿朴
  • c 如何拖控件做网站信息流广告图片
  • 朝阳公司做网站seo站点
  • 综合性电子商务网站有哪些百度托管运营哪家好
  • win10可以自己做网站标准百度网站建设
  • 邯郸wap网站建设报价如何做情趣网站
  • 大型做网站的公司有哪些国外域名免费注册
  • wordpress多站用户用照片做的ppt模板下载网站好
  • 网站在网站网站在哪里找到的阿里云域名注册及备案
  • 营销网站建设收费一句话宣传自己的产品
  • 成都网站注册如何在百度推广
  • 两学一做网站是多少钱企业网络管理 网站开发与运营
  • 网站搭建网站制作WordPress文章按钮
  • 建设银行企业网站无法打印回单邢台做网站的价格究竟多少钱?