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