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 百度

 

posted @ 2010-05-19 21:51  chenshun  阅读(1285)  评论(3编辑  收藏  举报