【移動應用開發技術】虛擬繼承_第1頁
【移動應用開發技術】虛擬繼承_第2頁
【移動應用開發技術】虛擬繼承_第3頁
免費預覽已結束,剩余1頁可下載查看

付費下載

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

【移動應用開發技術】虛擬繼承

在缺省情況下,C++中的繼承是按值組合的一種特殊情況,比如:classB:virtual

publicA{...};每個B類對象都含有其A基類子對象的所有非靜態數據成員,以及在B中聲明的非靜態數據成員。類似地,當派生類自己也作為一個基類對象時,如:classC:virtual

publicB{...};則C類對象含有在C中聲明的所有非靜態數據成員,以及其B子對象的所有非靜態數據成員和A子對象的所有非靜態數據成員。在單繼承下,這種由繼承支持的.特殊形式的按值組合提供了最有效的,最緊湊的對象表示。在多繼承下,當一個基類在派生層次中出現多次時就會有問題。最主要的實際例子是iostream類層次結構,在下圖ostream和istream類都從抽象ios基類派生而來,而iostream類又是從ostream和istream派生:classiostream:

publicistream,publicostream{...};缺省情況下,每個iostream類對象含有兩個ios子對象:在istream子對象中的實例以及在ostream子對象中的實例。這為什么不好?從效率上而言,存儲ios子對象的兩個復本,浪費了存儲區,因為iostream只需要一個實例。而且ios構造函數被調用了兩次,每個子對象一次,更嚴重的問題是由于兩個實例引起的二義性,例如:任何未限定修飾地訪問ios的成員都將導致編譯時刻錯誤。到底訪問哪個實例?如果ostream和istream對其ios子對象的初始化稍稍不同,會怎樣呢?怎樣通過iostream類保證這一對ios值的一致性?在缺省的按值組合機制下,真的沒有好辦法可以保證這一點。

C++語言的解決方案是,提供另一種可替代“按引用組合”的繼承機制:虛擬繼承。在虛擬繼承下,只有一個共享的基類子對象被繼承,而無論該基類在派生層次中出現多少次。共享的基類子對象被稱為虛擬基類,在虛擬繼承下,基類子對象的復制及由此而引起的二義性都被消除了。C++中虛擬繼承的概念

為了解決從不同途徑繼承來的同名的數據成員在內存中有不同的拷貝造成數據不一致問題,將共同基類設置為虛基類。這時從不同的路徑繼承過來的同名數據成員在內存中就只有一個拷貝,同一個函數名也只有一個映射。這樣不僅就解決了二義性問題,也節省了內存,避免了數據不一致的問題。class派生類名:virtual繼承方式

基類名virtual是關鍵字,聲明該基類為派生類的虛基類。在多繼承情況下,虛基類關鍵字的作用范圍和繼承方式關鍵字相同,只對緊跟其后的基類起作用。聲明了虛基類之后,虛基類在進一步派生過程中始終和派生類一起,維護同一個基類子對象的拷貝。C++虛擬繼承

概念:C++使用虛擬繼承(VirtualInheritance),解決從不同途徑繼承來的同名的數據成員在內存中有不同的拷貝造成數據不一致問題,將共同基類設置為虛基類。這時從不同的路徑繼承過來的同名數據成員在內存中就只有一個拷貝,同一個函數名也只有一個映射。

解決問題:解決了二義性問題,也節省了內存,避免了數據不一致的問題。

二義性:

#include"stdafx.h"#include<iostream>usingnamespacestd;

//Base

classBase

{

public:

Base(){cout<<"Basecalled..."<<endl;}

voidprint(){cout<<"Baseprint..."<<endl;}

private:

};//SubclassSub//定義一個類Sub{

public:

Sub(){cout<<"Subcalled..."<<endl;}

voidprint(){cout<<"Subprint..."<<endl;}

private:

};//ChildclassChild:publicBase,publicSub//定義一個類Child分別繼承自Base,Sub{

public:

Child(){cout<<"Childcalled..."<<endl;}

private:

};intmain(intargc,char*argv[]){

Childc;

//不能這樣使用,會產生二意性,VC下errorC2385

//c.print();

//只能這樣使用

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論