• c++继承


    C++ 神秘而特有的性质其实在于继承,举个例子。Circle「是一种」Ellipse,Ellipse「是一种」Shape;
    Square「是一种」Rectangle,Rectangle「是一种」Shape。

     class CShape // 形状
    {
      private:
       int m_color;
        public:
      void setcolor(int color) { m_color = color; }
     };


    class CRect : public CShape // 矩形是一种形状
     { // 它会继承 m_color 和setcolor()
       public:
      void display() { ... }
     };


     class CEllipse : public CShape // 椭圆形是一种形状
    { // 它会继承 m_color 和setcolor()
       public:
      void display() { ... }
    };


     class CTriangle : public CShape // 三角形是一种形状
    { // 它会继承 m_color 和setcolor()
      public:
       void display() { ... }
    };

    class CSquare : public CRect // 四方形是一种矩形
    {
       public:
       void display() { ... }
     };


    class CCircle : public CEllipse // 圆形是一种椭圆形
    {
       public:
      void display() { ... }
     };


    CRect rect1, rect2;
    rect1.setcolor(2); // 于是rect1.m_color = 2
    rect1.display(); // 调用CRect::display
    rect2.setcolor(3); // 于是rect2.m_color = 3
    rect2.display(); // 调用CRect::display

    说明:1.rect1.setcolor 和rect2.setcolor 调用的都是CRect::setcolor(其实也就是CShape::setcolor),
                之所以能分别处理不同对象的成员变量,完全是靠一个隐藏的this 指针。

            2. 所有类别都由CShape 衍生下来,所以它们都自然而然继承了CShape 的成员,
               包括变量和函数。也就是说,所有的形状类别都「暗自」具备了m_color 变量
        和setcolor 函数。

    下面重点谈谈this指针:

    rect1.setcolor(2); // rect1 是CRect 对象
    rect2.setcolor(3); // rect2 是CRect 对象

    编译器实际上为你做出来的码是:

    CRect::setcolor(2, (CRect*)&rect1);
    CRect::setcolor(3, (CRect*)&rect2);


    不过,由于CRect 本身并没有声明setcolor,它是从CShape 继承来的,所以编译器实际上产生的码是:
    CShape::setcolor(2, (CRect*)&rect1);
    CShape::setcolor(3, (CRect*)&rect2);

    多出来的参数,就是所谓的this 。

    至于类别之中,成员函数的定义:
    class CShape
    {
    ...
    public:
      void setcolor(int color) { m_color = color; }
    };
    被编译器整治过后,其实是:
    class CShape
    {
    ...
    public:
      void setcolor(int color, (CShape*)this) { this->m_color = color; }
    };
    一个对象的this指针并不是对象本身的一部分,不会影响sizeof(对象)的结果。this作用域是在类内部,当在类的非静态成员函数中访问类的非静态成员的时候,编译器会自动将对象本身的地址作为一个隐含参数传递给函数。也就是说,即使你没有写上this指针,编译器在编译的时候也是加上this的,它作为非静态成员函数的隐含形参,对各成员的访问均通过this进行。

    说了这么多一句话总结:this是一个指针,它时时刻刻指向实例本身

    参考文献:c++primer 百度

  • 相关阅读:
    Unity ShaderLab学习总结
    shader内置变量
    关于Unity中Shader的内置值
    Canvas控件最后一蛋——CanvasGroup
    Unity中关于Device Filter的选择问题
    Unity中使用扩展方法解决foreach导致的GC
    如何精简Unity中使用的字体文件
    好插件让你事半功倍!【资源篇】
    BFC(块级格式化上下文)的作用及生产方法
    获取视频或者音频时长
  • 原文地址:https://www.cnblogs.com/chenshun/p/1739599.html
Copyright © 2020-2023  润新知