在多重繼承中,處於中間層的類可能有一些用,但又不會例項化。在最終實現類中需要呼叫中間類的方法,同時必須保證在最終類中也實現該方法。如何做到?
說的不清晰,舉oceanbase的例子吧:
obphyoperator是乙個純虛基類,它要求每乙個子類都實現reset()方法:
class obphyoperator
;
obsinglechildphyoperator從obphyoperator繼承過來,是所有「single child operator"的父類,它有乙個成員」child_op_"。一些情況下為了能夠重用operator,在set_child之前需要呼叫reset重置child_op_狀態為null:
class obsinglechildphyoperator : public obphyoperator
;int obsinglechildphyoperator::set_child(obphyoperator *op)
child_op_ = op;
return ob_success;
}void obsinglechildphyoperator::reset()
obfinaloperator繼承自obsinglechildphyoperator,我們要求它一定有乙個reset()方法,用於管理operator的內部狀態,如記憶體、基本引數等。如何做到「一定」呢?上面obsinglechildphyoperator的
virtual void reset() = 0; // 注意這個 "=0" !!!!
保證了這一點。如果沒有「=0」,即使obfinaloperator不實現reset()方法,語法上也不會報錯,給**維護帶來困難。
下面通過乙個實驗來一步步學習這個技巧。
下面的**能夠編譯通過嗎?
#include /* cin, cout */
using namespace std;
class obphyoperator
;class obsinglechildphyoperator : public obphyoperator
;class obfinaloperator: public obsinglechildphyoperator
;int main()
報錯如下:
virtual_structure.cpp: in function 『int main()』:
virtual_structure.cpp:54: error: cannot allocate an object of abstract type 『obfinaloperator』
virtual_structure.cpp:35: note: because the following virtual functions are pure within 『obfinaloperator』:
virtual_structure.cpp:31: note: virtual void obsinglechildphyoperator::reset()
ok,為obsinglechildphyoperator加上reset實現呢?
#include /* cin, cout */
using namespace std;
/// base virtual class obphyoperator
class obphyoperator
;/// middle virtual class obsinglechildphyoperator
class obsinglechildphyoperator : public obphyoperator
;void obsinglechildphyoperator::reset()
/// obfinaloperator
class obfinaloperator: public obsinglechildphyoperator
;int main()
報錯依舊:
virtual_structure.cpp: in function 『int main()』:
virtual_structure.cpp:52: error: cannot allocate an object of abstract type 『obfinaloperator』
virtual_structure.cpp:35: note: because the following virtual functions are pure within 『obfinaloperator』:
virtual_structure.cpp:45: note: virtual void obsinglechildphyoperator::reset()
看來,必須在obfinaloperator中實現reset方法:
#include /* cin, cout */
using namespace std;
/// base virtual class obphyoperator
class obphyoperator
;/// middle virtual class obsinglechildphyoperator
class obsinglechildphyoperator : public obphyoperator
;void obsinglechildphyoperator::reset()
/// obfinaloperator
class obfinaloperator: public obsinglechildphyoperator
;void obfinaloperator::reset()
int main()
編譯通過,bingo~
多重繼承和多繼承 虛函式 純虛函式 抽象類 介面類
掌握多重繼承和多繼承的區別。多重繼承 即基類a 派生類b 繼承父類a 派生類c c繼承父類b 這裡說明的是,基類a中的資料成員 前提 公有繼承方式,會被派生類b所繼承,隱式的存放在派生類b的public下,此時派生類c公有繼承父類b,c中則包含從b和a中的公有資料成員和函式。多繼承 舉個例子 基類 ...
c 虛函式 多重繼承
如果類有虛函式,則類會有預設的乙個指標成員指向虛函式表 可能儲存在全域性區 的位址,指標占用4個位元組。虛函式 easytest.cpp 定義控制台應用程式的入口點。include stdafx.h include using namespace std class a class b public...
c 中的多重繼承和虛函式
c 中的多重繼承和虛函式不懂的地方如下 include using namespace std class base virtual void func const class derived1 public base class derived2 public derived1 void test...