物件導向——類設計(一)
如果一個類將自己的成員變數宣告為
protected
,則該類很有可能作為多型基類一個類的成員變數一般不宣告為
public
(如果非宣告為public不可的話,使用struct豈不是更好),而protected
與private
的區別正在於所修飾的變數是否子類可見。一個類的解構函式如果為virtual的話,則該類很多可能作為多型基類,則該類應有另外的virtual成員函式
實現一個類的順序
- 所有封裝的成員變數
- 圍繞成員變數的建構函式
- 成員變數的存取
- 其他成員變數
私有成員函式
有些類內部會有一些私有的函式,除了友元之外,
這些私有的函式只開放給類自身,也即僅會被類內部其他成員函式所呼叫,屬於勞模,屬於幹髒活累活的人,屬於幕後的工作人員,也即幕後英雄;
所以結論是什麼,私有成員函式僅被類內其他成員函式所呼叫,設計與實現的順序是,先設計私有,後設計公有。是先設計與實現私有成員函式,再實現需要依賴該私有成員函式的共有成員函式;
構成過載 vs 不構成過載?
DAttrInfo& cast_to_d();
const DAttrInfo& cast_to_d() const;
DAttrInfo& cast_to_d();
DAttrInfo& cast_to_d() const;
// 以上均可構成過載
DAttrInfo& cast_to_d();
const DAttrInfo& cast_to_d();
// 無法過載僅按返回型別區分的函式
預設構造和預設析構
類的預設建構函式會呼叫其全部成員變數(不包括內建型別)的預設建構函式(如果存在的話),同理類的預設解構函式會呼叫其全部成員變數的預設解構函式(如果存在的話)。
class Widget
{
public:
Widget() { cout << "Widget::Widget()" << endl;}
~Widget() { cout << "Widget::~Widget()" << endl;}
};
class Test
{
private:
int x;
Widget w;
public:
int get() const { return x;}
};
int main(int, char**)
{
Test t;
cout << t.get() << endl;
return 0;
}
為多型基類宣告virtual解構函式
enum TimerType
{
Atomic,
Water,
Writst
};
class TimeKeeper
{
public:
/*virtual*/ ~TimeKeeper() { cout << "TimeKeeper::~TimeKeeper()" << endl;}
};
class AtomicClock :public TimeKeeper
{
public:
~AtomicClock() { cout << "AtomicClock::~AtomicClock()" << endl;}
};
TimeKeeper* getTimeKeeper(TimeKeeperType type)
{
TimeKeeper* tk;
switch(type)
{
case Atomic:
tk = new AtomicClock;
break;
case Water:
tk = new WaterClock;
break;
case Wrist:
tk = new WristWatch;
break;
default:
tk = nullptr;
break;
}
return tk;
}
int main(int, char**)
{
TimeKeeper* tk = getTimeKeeper(Atomic);
delete tk;
// TimerKeeper::TimerKeeper()
// 如果解構函式不是virtual的,可見不會呼叫子類的解構函式
// 如果將基類的解構函式宣告為virtual,
// 當derived class物件經由base class指標刪除時,就會先呼叫基類的解構函式,再呼叫父類的解構函式
return 0;
}
再次請深入理解,virtual函式(普通函式以及解構函式)的目的是允許derived class的實現得以客製化
相關文章
- JS物件導向程式設計(一):物件JS物件程式設計
- 物件導向設計原則&設計模式分類物件設計模式
- 課時37:類與物件:物件導向程式設計物件程式設計
- Python如何設計物件導向的類(下)Python物件
- Python如何設計物件導向的類(上)Python物件
- Javascript 物件導向程式設計(一)JavaScript物件程式設計
- Python - 物件導向程式設計 - 什麼是 Python 類、類物件、例項物件Python物件程式設計
- Python學習之路——類-物件導向程式設計Python物件程式設計
- python之物件導向程式設計(一)Python物件程式設計
- 物件導向程式設計物件程式設計
- JS物件導向設計-建立物件JS物件
- 物件導向設計的設計模式(一):建立型模式(附 Demo & UML類圖)物件設計模式
- Javascript 設計模式之物件導向與 UML 類圖JavaScript設計模式物件
- Python物件導向程式設計Python物件程式設計
- JS物件導向設計模式JS物件設計模式
- 程式設計思想 物件導向程式設計物件
- js物件導向程式設計JS物件程式設計
- 十三、物件導向程式設計物件程式設計
- 物件導向設計原則物件
- 十六、物件導向程式設計物件程式設計
- Python 物件導向程式設計Python物件程式設計
- Java--物件導向設計Java物件
- python-程式導向、物件導向、類Python物件
- Java物件導向——類與物件Java物件
- 章10——物件導向程式設計(高階部分)——類名類方法物件程式設計
- 物件導向的程式設計在遊戲開發中使用(一):類物件程式設計遊戲開發
- 章10——物件導向程式設計(高階部分)——抽象類物件程式設計抽象
- js物件導向設計---建立物件的方式JS物件
- 物件導向程式設計C++物件程式設計C++
- Python OOP 物件導向程式設計PythonOOP物件程式設計
- python技能--物件導向程式設計Python物件程式設計
- javascript:物件導向的程式設計JavaScript物件程式設計
- JS物件導向的程式設計JS物件程式設計
- Javascript 物件導向程式設計(二)JavaScript物件程式設計
- Javascript 物件導向程式設計(三)JavaScript物件程式設計
- 06 物件導向程式設計 (續)物件程式設計
- Python物件導向程式設計(1)Python物件程式設計
- Scala的物件導向程式設計物件程式設計
- 物件導向分析與設計(OOAD)物件