[問題] 關於繼承的用法

看板C_and_CPP (C/C++)作者 (泰勞)時間13年前 (2012/07/07 16:35), 編輯推噓0(0013)
留言13則, 2人參與, 最新討論串1/1
// A.h class A { int a; public: A(); ~A(); void SetA(int); int GetA(); }; // B.h class B : public A { int b; public: B(); ~B(); }; // A.cpp A::A(){} A::~A(){} void A::SetA(int _A) { A = _A; }; int A::GetA() { return A; }; 想請問大家,當我在class A 如果新增一個method並且會使用到class A 宣告 的變數或是method時,我該如何去存取 ? Q1:假設我要設定a值,不考慮在A()的前提下,下面兩個做法哪個才好 1. a = 10; 2. this->a = 10; 3. SetA(10); 4. this->SetA(10); Q2:同理取a值時 1. 直接帶入a 2. 帶入this->a 3. GetA(); 4. this->GetA(); Q3:那在定義class A method時,應該是下面哪種 ? 1.void A::SetA(int _A) { A = _A;} 2.SetA(int _A) { A = _A; } 煩請告知 謝謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 122.116.218.207

07/07 21:18, , 1F
Q3 很簡單, 只是你把實作放在 spec 裡/外 的差別而已,
07/07 21:18, 1F

07/07 21:18, , 2F
放的位置取決於你"必需"的寫作方式, Q1 Q2 裡的 1 2
07/07 21:18, 2F

07/07 21:19, , 3F
是一樣的, 3 4 是一樣的, 在編譯器 resolve 時會發現
07/07 21:19, 3F

07/07 21:20, , 4F
該物件為 data member 故在存取的時候還是會經由 this
07/07 21:20, 4F

07/07 21:21, , 5F
指標透過位移計算去使用. 我會 prefer 3/4 的用法, 因
07/07 21:21, 5F

07/07 21:23, , 6F
為對其他 methods 來說, setter/getter 也是介面, 為
07/07 21:23, 6F

07/07 21:24, , 7F
了不依賴實作(即使你現階段就知道存取對象是誰), 但
07/07 21:24, 7F

07/07 21:24, , 8F
為了未來更名或者更換實作容易, 不牽連到其他更多程式
07/07 21:24, 8F

07/07 21:26, , 9F
碼, 所以"封裝"是比較好的, 除非函式呼叫花的時間讓你
07/07 21:26, 9F

07/07 21:27, , 10F
無法容忍才作最佳化. 關鍵字 Self Encapsulate Field
07/07 21:27, 10F

07/07 21:28, , 11F
method 內要對多個該類別 instance 作存取時, 我通常
07/07 21:28, 11F

07/07 21:28, , 12F
加上 this-> 來區分
07/07 21:28, 12F

07/07 22:34, , 13F
謝謝 loveme00835 的詳解 !!
07/07 22:34, 13F
文章代碼(AID): #1Fz_JfRQ (C_and_CPP)
文章代碼(AID): #1Fz_JfRQ (C_and_CPP)