多重繼承中的純虛函式「妙用」

2021-06-13 18:41:48 字數 3066 閱讀 7320

在多重繼承中,處於中間層的類可能有一些用,但又不會例項化。在最終實現類中需要呼叫中間類的方法,同時必須保證在最終類中也實現該方法。如何做到?

說的不清晰,舉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...