繼承
繼承的概念
類之間的兩大關係:組合和繼承:
- 組合關係的特點:
- 將其它類的對象作爲自己的成員使用
- 當前類的對象與成員對象的聲明期相同
- 成員對象在用法上與普通對象完全一致
組合關係的代碼示例:
class Memory
{
public:
Memory()
{
cout << "Memory()" << endl;
}
~Memory()
{
cout << "~Memory()" << endl;
}
};
class Disk
{
public:
Disk()
{
cout << "Disk()" << endl;
}
~Disk()
{
cout << "~Disk()" << endl;
}
};
class Computer
{
Memory mMem;
Disk mDisk;
public:
Computer()
{
cout << "Computer()" << endl;
}
~Computer()
{
cout << "~Computer()" << endl;
}
};
繼承(父子關係):
- 子類擁有父類的所有屬性和行爲
- 子類就是一種特殊的父類
- 子類對象可以當做父類對象使用
- 子類中可以添加父類沒有的方法和屬性
C++中通過下面的方式描述繼承關係
class Parent
{
int mv;
public:
void method() {};
};
class Child: public Parent // 描述繼承關係
{
};
- 重要規則:
- 子類就是一個特殊的父類
- 子類對象可以直接初始化父類對象
- 子類對象可以直接賦值給父類對象
繼承關係代碼示例:
#include <iostream>
#include <string>
using namespace std;
class Parent
{
int mv;
public:
Parent()
{
cout << "Parent()" << endl;
mv = 100;
}
void method()
{
cout << "mv = " << mv << endl;
}
};
class Child : public Parent
{
public:
void hello()
{
cout << "I'm Child calss!" << endl;
}
};
int main()
{
Child c;
c.hello();
c.method();
return 0;
}
繼承的訪問級別
根據面向對象理論:
- 子類擁有父類的一切屬性和行爲
- 子類能夠直接訪問父類的私有成員
根據C++語法:
- 外界不能直接訪問類的private成員
- 子類不能直接訪問父類的私有成員
舉一個例子:
class Parent
{
private:
int mv;
public:
Parent()
{
mv = 100;
}
int value()
{
return mv;
}
};
class Child : public Parent
{
public:
int addValue(int v)
{
//子類直接訪問父類的私有成員變量
mv = mv + v;
}
};
int main()
{
return 0;
}
運行結果如下:
nethanhandeMacBook-Pro-2:代碼 nethanhan$ g++ 44-1.cpp
44-1.cpp:27:9: error: 'mv' is a private member of 'Parent'
mv = mv + v; // ???? <C8><E7><BA>η<C3><CE>ʸ<B8><C0><E0><B5>ķǹ...
^
44-1.cpp:9:9: note: declared private here
int mv;
^
44-1.cpp:27:14: error: 'mv' is a private member of 'Parent'
mv = mv + v; // ???? <C8><E7><BA>η<C3><CE>ʸ<B8><C0><E0><B5>ķǹ...
^
44-1.cpp:9:9: note: declared private here
int mv;
^
2 errors generated.
結果裏說到 mv 是一個私有成員變量,在子類中不能直接私有成員。所以需要使用另外一個關鍵字 protested
。
- 關鍵字
protected
的意義:
- 修飾的成員不能被外界直接訪問
- 修飾的成員可以被子類直接訪問
- 沒有protected就無法完成真正意義上的代碼複用
使用示例:
class Parent
{
//這裏使用關鍵字 protected來聲明
//子類就可以直接訪問到
//而且外界不可以直接訪問到
protected:
int mv;
public:
Parent()
{
mv = 100;
}
int value()
{
return mv;
}
};
class Child : public Parent
{
public:
int addValue(int v)
{
//子類可以直接使用父類的成員變量
mv = mv + v;
}
};
繼承方式
- C++中支持三種不同的繼承方式
public
繼承
- 父類成員在子類中保持原有訪問級別
private
繼承
- 父類成員在子類中變爲私有成員
protected
繼承
- 父類中的公有成員變爲保護成員,其它成員保持不變
- C++中的默認繼承方式爲private
- 繼承方式比較
繼承方式\父類成員訪問級別 | public | protected | private |
---|---|---|---|
public | public | protected | private |
protected | protected | protected | private |
private | private | private | private |
- 注意:
- 一般而言,C++工程項目中只使用public 繼承
- C++的派生語言只支持一種繼承方式(public 繼承)
- protected 和 private 繼承帶來的複雜性遠大於實用性