c++虚继承和虚函数和抽象类、接口类,聚合类
虛繼承
虛繼承用于解決多繼承條件下的菱形繼承問題(浪費存儲空間、存在二義性)。
底層實現原理與編譯器相關,一般通過虛基類指針和虛基類表實現,每個虛繼承的子類都有一個虛基類指針(占用一個指針的存儲空間,4字節)和虛基類表(不占用類對象的存儲空間)(需要強調的是,虛基類依舊會在子類里面存在最多一份拷貝);當虛繼承的子類被當做父類繼承時,虛基類指針也會被繼承。
實際上,vbptr 指的是虛基類表指針(virtual base table pointer),該指針指向了一個虛基類表(virtual table),虛表中記錄了虛基類與本類的偏移地址;通過偏移地址,找到虛基類成員,而虛繼承也不用像普通多繼承那樣維持著公共基類(虛基類)的兩份同樣的拷貝,節省了存儲空間。
虛繼承、虛函數
?相同之處:都利用了虛指針(均占用類的存儲空間)和虛表(均不占用類的存儲空間)
?不同之處:
–虛繼承
?虛基類依舊存在繼承類中,只占用存儲空間
?虛基類表存儲的是虛基類相對直接繼承類的偏移
–虛函數
?虛函數不占用存儲空間
?虛函數表存儲的是虛函數地址
模板類、成員模板、虛函數
?模板類中可以使用虛函數
?一個類(無論是普通類還是類模板)的成員模板(本身是模板的成員函數)不能是虛函數
抽象類、接口類、聚合類
?抽象類:含有純虛函數的類
?接口類:僅含有純虛函數的抽象類
?聚合類:用戶可以直接訪問其成員,并且具有特殊的初始化語法形式。滿足如下特點:
–所有成員都是 public
–未定義任何構造函數
–沒有類內初始化
–無基類,也沒有 virtual 函數
總結
以上是生活随笔為你收集整理的c++虚继承和虚函数和抽象类、接口类,聚合类的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 合众的二手房怎么样?
- 下一篇: c++如何定义一个只能在堆上(栈上)生成