侯捷的MFC 中有#0001 class CShape // 形狀
#0002 {
#0003 private:
#0004 int m_color;
#0005
#0006 public:
#0007 void setcolor(int color) { m_color = color; }
#0008 };
#0009
#0010 class CRect : public CShape // 矩形是㆒種形狀
#0011 { // 它會繼承m_color 和setcolor()
#0012 public:
#0013 void display() { ... }
#0014 };
#0015
#0016 class CEllipse : public CShape // 橢圓形是㆒種形狀
#0017 { // 它會繼承m_color 和setcolor()
#0018 public:
#0019 void display() { ... }
#0020 };
#0021
#0022 class CTriangle : public CShape // ㆔角形是㆒種形狀
#0023 { // 它會繼承m_color 和setcolor()
#0024 public:
#0025 void display() { ... }
#0026 };
#0027
#0028 class CSquare : public CRect // ㆕方形是㆒種矩形
#0029
#0030 public:
#0031 void display() { ... }
#0032 };
#0033
#0034 class CCircle : public CEllipse // 圓形是㆒種橢圓形
#0035 {
#0036 public:
#0037 void display() { ... }
#0038 };
於是你可以這麼動作:
CSquare square;
CRect rect1, rect2;
CCircle circle;
square.setcolor(1); // 令square.m_color = 1;
第2章C++ 的重要性質
square.display(); // 呼叫CSquare::display
rect1.setcolor(2); // 於是rect1.m_color = 2
rect1.display(); // 呼叫CRect::display
rect2.setcolor(3); // 於是rect2.m_color = 3
rect2.display(); // 呼叫CRect::display
circle.setcolor(4); // 於是circle.m_color = 4
circle.display(); // 呼叫CCircle::display
注意以下這些事實與問題:
1. 所有類別都由CShape 衍生而來,所以它們都自然而然繼承了CShape 的成員,
包括變數和函式。也就是說,所有的形狀類別都「暗自」具備了m_color 變數
和setcolor 函式。我所謂暗自(implicit),意思是無法從各衍生類別的宣告
直接看出來。
2. 兩個矩形物件rect1 和rect2 各有自己的m_color,但關於setcolor 函式卻是
共用相同的CRect::setcolor(其實更應該說是CShape::setcolor)。我用這張圖表
示其間的關係:
物件rect1
m_color
rect1.setcolor 和rect2.setcolor 呼叫的都是CRect::setcolor,
後者之所以能分別處理不同物件的成員變數,完全是靠一個隱藏的this 指標。
物件rect2
m_color CRect::setcolor(int color,
CRect* this)
{
this->m_color = color;
}
我看到 m_color是私有变量 ,私有变量 不是不可以继承吗? 而根据上边的话 , 怎么也可以继承?????

解决方案 »

  1.   

    所谓继承,可以理解为子类包含了一个父类的对象,在子类中的对象中,父类的私有成员也是存在的,只不过是子类中定义的成员函数没有对父类的私有成员的访问权限。
    具体到上面的情况,m_color是私有的,但子类可以通过父类的公有成员函数访问这个私有的成员变量。
      

  2.   

    ruihuahan(飞不起来的笨鸟) 说的对.私有变量也会被继承,只不过在派生类中是不能直接访问的,必需通过父类提供的公有成员函数来访问它。
      

  3.   

    实际上是这样的:
    在子类里面,父类是一个子对象。
    class CChild : public CParent
    {......
    }和
    class CChild
    {
        CParent mParent;......
    }是差不多的,所不同的是对父类成员的访问方式而已。