C++多重繼承與虛基類及與.NET的比較


多重繼承
前面我們介紹的派生類只有一個基類,稱為單基派生或單一繼承。在實際運用中,我們經常需要派生類同時具有多個基類,這種方法稱為多基派生或多重繼承。
2.1 多重繼承的聲明:
在 C++ 中,聲明具有兩個以上基類的派生類與聲明單基派生類的形式類似,只需將要繼承的多個基類用逗號分開即可。
在多重繼承中,公有派生和私有派生對于基類成員在派生類的可訪問性與單繼承的規則相同。
另外,對基類成員的訪問必須是無二義的,若兩個基類中具有同名的數據成員或成員函數,使用成員名限定來消除二義性,若派生類中新增成員或成員函數與基類成員或成員函數同名,則派生類會覆蓋外層同名成員,也須使用作用域分辨符。
2.2 多重繼承的構造函數和析構函數:
多重繼承的構造函數的定義形式與單繼承構造函數的定義形式類似,只有 n 個基類的構造函數之間用“,”分隔。
多重繼承的構造函數的執行順序與單繼承構造函數的執行順序相同,也是遵循先執行基類的構造函數,再執行對象成員的構造函數,最后執行派生類構造函數的原則。在多個基類之間,則嚴格按照派生類聲明是從左到右的順序來排列先后。而析構函數的執行順序與構造函數的執行順序相反。
2.3 虛基類 :
如果某個派生類的部分或全部直接基類是從另一個共同的基類派生而來,在這些基類中,從上一級基類繼承來的成員就有相同的名稱,則在這個派生類中訪問這個共同的基類中的成員時,可能會產生二義性,此時,可定義虛基類。這就要求在其直接基類的定義中,使用關鍵字 virtual 將那個共同的基類定義為虛基類,其語法形式如下:
class 派生類名: virtual 派生方式 基類
虛基類的初始化與一般的多重繼承的初始化在語法上是一樣的 ,但構造函數的調用順序不同,虛基類構造函數的調用順序是這樣規定的:
1) 在同一層次中,先調用虛基類的構造函數,接下來依次是非虛基類的構造函數,對象成員的構造函數,派生類的構造函數。
2) 若同一層次中包含多個虛基類,這些虛基類的構造函數按對他們說明的先后次序調用
3) 若虛基類由非虛基類派生而來,則仍然先調用基類構造函數,再調用派生類構造函數。

?

上面是理論,有點兒晦澀,下面舉一個例子.以下圖為例:

繪圖1

接口Common是所有類的公共接口,Server接口繼承Common接口,Client接口繼承Common接口,CommonImpl是Common接口的一個公共實現。ServerImpl是Server接口的實現,它的Common接口的實現直接使用CommonImpl類的實現。

如果在C#中,這個問題會自然而優雅的解決,即編譯器會知道,如果1個類繼承了Server接口,又繼承了CommonImpl實現,那么ServerImpl只需要實現Server接口中特定的方法即可。唯一的限制是CommonImpl必須放在Server接口的前面。看下面的演示代碼:

using System;
using System.Collections.Generic;
using System.Text;namespace Demo
{interface IA{string funcInA();}interface IB : IA{string funcInB();}public class CA : IA{#region IA 成員public string funcInA(){return "CA.funcInA";}#endregion}public class CB : CA, IB{#region IB 成員public string funcInB(){return "CB.funcInB";}#endregion}}

類CB只需要實現接口IB中的方法即可。CA,IB必須以這個順序出現;

?

對于C++而言,編譯器是不知道的,如果你希望所有子類共享一個基類,或者子類都共用一個通用實現的基類,那么你需要把共享的那部分,聲明為virutal基類,上圖中的例子,就必須把Common的子類繼承,聲明為虛基類繼承。

#pragma once
#include <iostream>
using namespace std;class IA
{
public:virtual int FuncInA() =0;
};class IB:virtual public IA
{
public:virtual int FuncInB()=0;
};class CA:virtual public IA
{
public:virtual int FuncInA(){cout<<" CA::FuncInA "<<endl;return 1;};
};class CB:public CA,public IB
{
public:int FuncInB(){cout<<"CB::FuncInB"<<endl;return 2;};/*virtual int FuncInA()
    {

        cout<<"CB::FuncInA"<<"  Call CA::FuncInA() ==>"<<CA::FuncInA()<<endl;
        return 3;
    };*/};

上面的代碼編譯可以通過,且結果如期望。如果去掉virtual繼承修飾符,就會報錯。

轉載于:https://www.cnblogs.com/sgsoft/archive/2010/07/20/1781724.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/379120.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/379120.shtml
英文地址,請注明出處:http://en.pswp.cn/news/379120.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Javascript的IE和Firefox兼容性匯編

window.event現有問題&#xff1a;使用 window.event 無法在 FF 上運行解決方法&#xff1a;FF 的 event 只能在事件發生的現場使用&#xff0c;此問題暫無法解決。可以這樣變通&#xff1a;原代碼(可在IE中運行)&#xff1a;<input type"button" name"someB…

Java Double類compareTo()方法與示例

雙類compareTo()方法 (Double class compareTo() method) compareTo() method is available in java.lang package. compareTo()方法在java.lang包中可用。 compareTo() method is used to check equality or inequality for this Double-object against the given Double-obje…

平院實訓門禁系統導入

這是我的配置&#xff08;如果是Win10最好每一步都管理員身份運行&#xff09; win7 SQLServer2008 VS2012 切記&#xff1a;注意&#xff1a;當你SQLserver創建數據庫和VS連接數據庫的時候得用同一種方式&#xff0c;要么都用window&#xff08;主機名&#xff09;&#xff0…

ffmpeg 解碼音頻(aac、mp3)輸出pcm文件

ffmpeg 解碼音頻&#xff08;aac、mp3&#xff09;輸出pcm文件 播放pcm可以參考&#xff1a; ffplay -ar 48000 -ac 2 -f f32le out.pcm main.c #include <stdio.h> #include <stdlib.h> #include <string.h>#include <libavutil/frame.h> #include …

Jquery getJSON()

getJSON與aspx 準備工作 Customer類 public class Customer{public int Unid { get; set; }public string CustomerName { get; set; }public string Memo { get; set; }public string Other { get; set; }}&#xff08;一&#xff09;ashx Customer customer new Customer { …

北京中信銀行總行地址_中信銀行拉薩分行舉行“存款保險標識”啟用和存款保險條例宣傳活動...

11月NOV中信銀行拉薩分行舉行“存款保險標識”啟用和《存款保險條例》宣傳活動揭牌啟用儀式111月Jul根據人民銀行和總行關于“存款保險標識”啟用工作相關要求&#xff0c;分行行領導高度重視“存款保險標識”啟用和《存款保險條例》宣傳活動工作&#xff0c;按照統一工作部署、…

Java ClassLoader getPackage()方法與示例

ClassLoader類的getPackage()方法 (ClassLoader Class getPackage() method) getPackage() method is available in java.lang package. getPackage()方法在java.lang包中可用。 getPackage() method is used to return the package that has been defined in ClassLoader or t…

C---編寫程序:求出1~1000之間能被7或12整除,但不能同時被二者整除的所有整數,將結果保存在數組中,要求程序數據的輸入、計算和輸出均使用函數實現。

編寫程序&#xff1a;求出1~1000之間能被7或12整除&#xff0c;但不能同時被二者整除的所有整數&#xff0c;將結果保存在數組中&#xff0c;要求程序數據的輸入、計算和輸出均使用函數實現。 編程思路&#xff1a;分別編寫函數input()、cal()、output()實現數據的輸入、計算和…

報告稱我國成最大移民輸出國 將形成投資產業鏈(關注)

時代特有的現象&#xff0c;我們應該予以關注 “現在國內房價這么高&#xff0c;政策也看不清&#xff0c;還不如逢高賣掉之前買的幾套房子&#xff0c;一兩套房子的錢辦個投資移民&#xff0c;趁還年輕&#xff0c;拿到綠卡后享受一下美國本國待遇的高等教育了。”廣州&#x…

轉整型_156.Ruby烘焙大理石豆沙吐司解鎖大理石花紋整型

好看又好吃的大理石豆沙面包。紅豆餡均勻分布在松軟細膩的面包體里&#xff0c;手撕著吃&#xff0c;一層層的甜美與溫柔&#xff5e;關于吐司面包&#xff0c;我公眾號里寫過白吐司(基礎款牛奶吐司&#xff0c;超綿鮮奶油吐司)和全麥吐司(基礎款50%全麥吐司&#xff0c;經典燕…

ffmpeg 解碼視頻(h264、mpeg2)輸出yuv420p文件

ffmpeg 解碼視頻&#xff08;h264、mpeg2&#xff09;輸出yuv420p文件 播放yuv可以參考&#xff1a;ffplay -pixel_format yuv420p -video_size 768x320 -framerate 25 out.yuv main.c #include <stdio.h> #include <stdlib.h> #include <string.h>#includ…

VS2010 快捷鍵 (空格顯示 綠點, Tab 顯示箭頭)

VS2010 有用的快捷鍵 &#xff1a; Ctrl r, ctrl w, 切換空格示。 轉載于:https://www.cnblogs.com/fengye87626/archive/2012/11/21/2780716.html

C---編寫程序:實現一個隨堂測試,能進行加減乘除運算。要求如下:(1)隨機產生兩個1~10的正整數,在屏幕上輸出題目,如:5+3=?(2)學生輸入答案,程序檢查學生輸入答案是否正確,若正確,

編寫程序&#xff1a;實現一個隨堂測試&#xff0c;能進行加減乘除運算。要求如下&#xff1a; 1&#xff09;隨機產生兩個1~10的正整數&#xff0c;在屏幕上輸出題目&#xff0c;如&#xff1a;53&#xff1f; 2&#xff09;學生輸入答案&#xff0c;程序檢查學生輸入答案是…

分析一下mp4格式的trak -> mdia -> minf -> stbl -> stts、stsc 這兩個box信息

分析一下mp4格式的trak -> mdia -> minf -> stbl -> stts、stsc 這兩個box信息 &#xff08;因為這兩個box在音頻trak和視頻trak 下都有的&#xff0c;而且都有一個數組的值是比較繞的&#xff09; 目錄&#xff1a;stts&#xff1a;記錄時間戳的&#xff0c;每個s…

利用SQL注入2分鐘入侵網站

說起流光、溯雪、亂刀&#xff0c;可以說是大名鼎鼎無人不知無人不曉&#xff0c;這些都是小榕哥的作品。每次一提起小榕哥來&#xff0c;我的崇拜景仰就如滔滔江水&#xff0c;連綿不絕~~~~&#xff08;又來了&#xff01;&#xff09; 讓我們崇拜的小榕哥最新又發布了SQL注入…

pip安裝deb_技術|如何在 Ubuntu 上安裝 pip

pip 是一個命令行工具&#xff0c;允許你安裝 Python 編寫的軟件包。 學習如何在 Ubuntu 上安裝 pip 以及如何使用它來安裝 Python 應用程序。有許多方法可以在 Ubuntu 上安裝軟件。 你可以從軟件中心安裝應用程序&#xff0c;也可以從下載的 DEB 文件、PPA(LCTT 譯注&#xff…

assubclass_Java類class asSubclass()方法及示例

assubclass類類asSubclass()方法 (Class class asSubclass() method) asSubclass() method is available in java.lang package. asSubclass()方法在java.lang包中可用。 asSubclass() method casts this Class object to denote a subclass of the class denoted by the given…

VB6.0 怎樣啟用控件comdlg32.ocx

VB6.0 怎樣啟用控件comdlg32.ocx 怎樣啟用控件comdlg32.ocx 2008-10-08 09:32 提問者&#xff1a; nefu_20061617 |瀏覽次數&#xff1a;1502次vbs文件中有代碼Set ComDlg CreateObject("MSComdlg.CommonDialog")運行時發生錯誤ActiveX 部件不能創建對象: MSComdlg.…

Python---爬蟲案例

例1、爬取公眾號文章中的圖片。 1&#xff0c;首先打開要獲取公眾號文章的地址 2&#xff0c;按下F12&#xff0c;再按Ctrl Shift C&#xff0c;然后鼠標移動到圖片位置&#xff0c;然后觀察控制臺中顯示圖片對應的代碼位置 3&#xff0c;分析該位置的代碼段 代碼段如下&…

WinCE驅動開發問題精華集錦(二)

轉自&#xff1a;http://hgh123.blog.163.com/blog/static/5980422120086183115543/ 感謝 我怎么能在PB左邊的定制平臺加進我的驅動呢&#xff1f; 兩種辦法&#xff1a; 1、在platform.bib或者project.bib的MODULES部分添加一條語句&#xff0c;例如&#xff1a; MyDriver.dll…