C 多重繼承和基類位址

2021-08-07 03:26:34 字數 814 閱讀 7774

c++支援多重繼承,比如

class derived : public base1, public base2

virtual void theinte***ce() = 0;

int somedata1;

};// base class

class b

int somedata2;

};class c : public b, public a

// implement inte***ce in a

virtual void theinte***ce() override

};int main(int argc, const char **argv)

輸出:b created at 140235107214924

a created at 140235107214912

c created at 140235107214912

segmentation fault: 11

問題的關鍵是,繼承類有兩個基類b和a,它們位於不同的記憶體位址(上面的例子裡特意加了成員變數int somedata1;和int somedata2;就是為了防止b和a碰巧位址重合。

編譯器在處理這一行的時候:

b *obj = new c;

會把c的基類b的位址賦給obj,而不是c的位址! 因為b和a沒有任何關係,obj當然無法直接訪問到a和c的函式了。

解決方法:

因為b和c是繼承關係,可以通過b得到c的位址,然後就得到a的位址了:

a *a = (c *)obj;

a訪問theinte***ce毫無問題了

C 多重繼承 虛基類

使用多個基類的繼承被稱為多重繼承 mi mi描述的是有多個直接基類的類。與單繼承一樣,公有mi表示的也是 is a關係。mi帶來的兩個主要問題 1.從兩個不同的基類繼承同名方法。2.從兩個或更多相關基類那裡繼承同一類的多個例項。例如 singer 和 waiter都繼承了乙個worker 元件,因此...

C 多重繼承與虛基類

多重繼承就是乙個派生類繼承了多個基類。i 通過成員初始化列表指定建構函式 class d public b,public c ii 構造函式呼叫順序 class b void f class c void f class d public b,public c void f int main 輸出 ...

c 筆記 多重繼承 虛基類

虛基類多重繼承建構函式規則 多重繼承也成mi,描述的是有多個直接基類的類。和單繼承一樣,公有mi表示的也是is a關係。必須使用關鍵字public限定每乙個基類 除了非特別之處,編譯器預設為私有派生 singerwaiter類繼承自singer和waiter,而singer和waiter有這共同的祖...