• c/c++笔记--5


    1、假设derived类继承自base类,那么derived与base是一种“is  a”的关系,即derived类是base类,反之错误;

    假设derived类虚继承自base类,那么derived与base是一种“has  a”的关系,即derived类有一个指向base类的vptr。

    2、virtual base class的原始模型是在class object中为每一个有关联的virtual base class加上一个指针vptr,

    该指针指向virtual基类表。有的编译器是在继承类已存在的virtual table直接扩充导入一个virtual base class table。

    不管怎么样由于虚继承已完全破坏了继承体系,不能按照平常的继承体系来进行类型转换。

    3、编译器必须保证虚函数表的指针存在于对象实例中最前面的位置。这意味着只要通过对象实例的地址就能得到虚函数表,

    然后就能遍历其中的函数指针,并调用相应的函数。

    4、void f(int value)

    {

      try{

          if(someFunction())

          {

            throw value;

          }

      }

      catch(double d){

      }

    }

    如果someFunction()返回true,就抛出一个int,但是catch子句处理类型为double的exceptions。

    try语句块中抛出的int exception绝不会被用来捕捉double exception的catch子句捕捉到,后者只能捕捉类型确确实实为

    double的exceptions,其间不会有类型转换的行为发生。

    5、“exceptions与catch子句相匹配”的过程中,仅有两种转换可以发生。第一种是“继承架构中的类转换”,即base class exceptions的catch子句可以捕捉类型为derived class的exceptions。第二种允许发生的转换是从一个“有型指针”转换为“无型指针”,即一个const void*指针的catch子句可以捕捉任何指针类型的exception。

    6、catch子句总是依出现顺序做匹配尝试:
    try{

    }

    catch(base class& ex){

    }

    catch(derived class& ex){

    }

    第二个catch子句将不会执行起来,因为所有的derived class exceptions都会被base class的catch子句捕捉。

    上述这样的代码在c++中通常是不正确的,编译器可能会发出一个警告,甚至错误消息。因此,绝对不要将base class的catch子句放在derived class的catch子句之前。应改为:
    try{

    }

    catch(derived class& ex){

    }

    catch(base class& ex){

    }

    先捕捉derived class exceptions,再捕捉base class exceptions。

  • 相关阅读:
    自学Linux Shell5.2-shell内建命令history alias
    自学Linux Shell5.1-shell父子关系
    vue2.0 实现导航守卫(路由守卫)
    vue2.0 关于Vue实例的生命周期
    vue2.0 正确理解Vue.nextTick()的用途
    vue2.0 项目build后资源文件报错404的解决方案
    vue2.0 vetur插件提示 'v-for' directives require 'v-bind:key' directives 的解决办法
    vue2.0 微信oauth认证的正确调用位置
    vue2.0 样式表引入的方法 css sass less
    vue2.0 配置sass
  • 原文地址:https://www.cnblogs.com/Jace-Lee/p/5834518.html
Copyright © 2020-2023  润新知