c++继承

本文深入解析C++中的继承机制及其在类之间的应用,特别关注this指针的作用与实现细节,通过具体代码示例展示如何通过继承实现多态性,以及this指针在成员函数调用过程中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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是一个指针,它时时刻刻指向实例本身
-- 本文来源于创世软件团队博客, 原文地址: http://www.cnblogs.com/chenshun/archive/2010/05/19/1739599.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值