多重繼承引起的二義性問題和虛基類

多重繼承容易引起的問題就是因為繼承的成員同名而產生的二義性問題。

例:類A和類B中都有成員函數display和數據成員a,類C是類A和類B的直接派生類

情況一:

class A
{public:int a;void display();
};
class B
{public:int a;void display;
};
class C:public A,public B//公用繼承
{public:int b;void show();
};

如果在main函數中定義類C的對象c1并調用數據成員a和成員函數display

C c1;
c1.a=3;//引用c1的數據成員a
c1.dispaly();//調用c1的成員函數display

由于基類A和基類B都有數據成員a和成員函數display,編譯系統無法判別要訪問的是哪一個基類的成員,因此,程序編譯出錯。

解決方法1、用基類名來限定

c1.A::a=3;//引用c1對象中的基類A的數據成員a
c2.A::display();//引用c1的成員函數display

若派生類C中的成員函數show訪問基類A的display和a,可以不必寫對象名而直接寫

c1.A::A=3;//引用c1對象中的基類A的數據成員a
c1.A::display();//調用c1對象中的基類A的成員函數display

不同的成員函數,只有在函數名和參數個數相同、類型相匹配的情況下才發生同名覆蓋,如果只有函數名相同而參數不同,不會發生同名覆蓋,而屬于函數重載。

虛基類的作用:

C++提供虛基類的方法,使得在繼承間接共同基類時只保留一份成員。

使用虛基類發方法:

class A//聲明基類A

{.........};

class B:virtual public A//聲明類B是類A的公用派生類,A是B的虛基類

{......};

class C:virtual public A//聲明類C是類A的公用派生類,A是C的虛基類

{......};

注意:虛基類并不是在聲明基類時聲明的,而是在聲明派生類時,指定繼承方式時聲明的。

聲明虛基類的一般形式為:

class 派生類名:virtual 繼承方式 基類名

經過上面的聲明后,當基類通過多條派生路徑被一個派生類繼承時,該派生類只繼承該基類一次,也就是說,基類成員只保留一次。

二、虛基類的初始化

class A//定義基類A

{

? ? ? ? A(int i){}//基類構造函數,有一個參數

.......};

class B:virtual public A//A作為B的虛基類

{

? ? ? ? B(int n):A(n){}//類B構造函數,在初始化表中對虛基類初始化

...};

class C:virtual public A//A作為C的虛基類

{

? ? ? ? C(int n):A(n){}

......};//類C的構造函數,在初始化表中對虛基類初始化

class D:public B,public C//類D的構造函數,在初始化表中對所有基類初始化

{

? ? ? ? D(int n):A(n),B(n),C(n){}

......};

應用:

#include<iostream>
#include<string>
using namespace std;
class Person
{
public:Person(string nam, char s, int a) {name = nam;sex = s;age = a;}
protected:string name;char sex;int age;
};
class Teacher :virtual public Person
{
public:Teacher(string nam, char s, int a, string t) :Person(nam, s, a){title = t;}
protected:string title;
};
class Student :virtual public Person
{
public:Student(string nam, char s, int a, float sco) :Person(nam, s, a){score = sco;}
protected:float score;
};
class Graduate :virtual public Teacher, public Student//Teacher和Student為直接基類
{
public:Graduate(string nam, char s, int a, string t, float sco, float w) :Person(nam, s, a), Teacher(nam, s, a, t), Student(nam, s, a, sco){wage = w;}void show(){cout << "name:" << name << endl;cout << "age:" << age << endl;cout << "sex:" << sex << endl;cout << "title:" << title << endl;cout << "score:" << score << endl;cout << "wage:<" << wage << endl;}
private:float wage;
};
int main()
{Graduate grad1("yan_tong", 'f', 24, "saadistant", 99.9, 3000);grad1.show();return 0;
}

運行結果:

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

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

相關文章

添加AXI主IP(AXI4 Lite和AXI4)示例

添加AXI主IP&#xff08;AXI4 Lite和AXI4&#xff09;示例 將等效IP添加到框圖中。以下是AXI Central的示例步驟 直接存儲器存取&#xff08;CDMA&#xff09;&#xff1a; 1.右鍵單擊方框圖中的任意位置&#xff0c;然后選擇“添加IP”。 2.搜索并雙擊AXI Central Direct Memo…

Android 錄音AudioRecord

AudioRecord是安卓多媒體框架中用于錄制音頻的工具。它支持錄制原始音頻數據&#xff0c;即PCM數據&#xff0c;PCM數據不能被播放器直接播放&#xff0c;需要編碼壓縮成常見音頻格式才能被播放器識別。通常生成PCM文件之后可將PCM文件轉成WAV文件一般的播放器便可直接播放了。…

前端開發技巧 --判斷文本是否溢出

const isTextOverflower()>{if(element){return element.offsetWidth > element.scrollWidth}return false}實現javascript 判斷文本是否溢出

【除了知乎,大家都在逛什么?持續更新~~】

除了知乎&#xff0c;大家都在逛什么&#xff1f; 中文博客瑯琊榜 https://github.com/qianguyihao/blog-list 中文博客瑯琊榜&#xff0c;只收錄優質的中文獨立博客&#xff0c;全網最精品。已收錄博客數量&#xff1a;328 個博客站點。 這些博主才華橫溢&#xff0c;滿懷自由…

【2024最新】軟考資料大全(免費)

IT行業越來越卷&#xff0c;大家都在忙著搞證&#xff0c;你免費不搞一個&#xff1f; 不管有沒有用&#xff0c;有總比沒有好噻~ 【初級】&#xff0c;【中級】&#xff0c;【高級】 都有&#xff0c;而且全部免費&#xff0c;全部最新的&#xff01;真題&#xff0c;論文都…

Java查看線上對象的變量值

背影 有時候線上有些配置類&#xff0c;想查看下配置修改是否生效&#xff0c;傳統的方法要通過打日志的方法&#xff0c;如果不想通過打日志的方法&#xff0c;有沒有好的方案能解決這個問題呢 解決方案 arthas 步驟 得到類加載器的hashcode sc -d com.example.MyService…

眼底項目經驗

眼底項目經驗 可解釋性不足問題眼底項目有多牛逼可解釋性不足解法數據、算力、算法都免費送不僅預測當下&#xff0c;還能預測未來和慢病管理整合&#xff0c;形成一個實時健康檢測生態 可解釋性不足問題 今天下午和騰訊眼底項目人員討論, 他們不準備做全身性的多疾種, 因為深…

LINUX環境基礎練習題(附帶答案)

&#x1f525; 交流討論&#xff1a;歡迎加入我們一起學習&#xff01; &#x1f525; 資源分享&#xff1a;耗時200小時精選的「軟件測試」資料包 &#x1f525; 教程推薦&#xff1a;火遍全網的《軟件測試》教程 &#x1f4e2;歡迎點贊 &#x1f44d; 收藏 ?留言 &#x1…

【typescript - tsc 編譯后路徑問題/路徑別名問題】

這幾天在寫typescript&#xff0c;遇到個路徑依賴問題&#xff0c;編寫的.ts文件直接運行OK&#xff0c;但是編譯成.js后&#xff0c;運行提示 Error: Cannot find module xxx&#xff0c;&#x1f4dd;記錄分析和解決過程 。 問題描述 原始文件&#xff0c;有index.ts 其會引…

小白不知道怎么投稿?記住這個好方法

作為一名單位信息宣傳員,我最初踏上這條道路時,滿心憧憬著通過文字傳遞我們單位的精彩瞬間,讓社會聽見我們的聲音。然而,理想與現實之間的距離,卻在一次次郵箱投稿的石沉大海中漸漸清晰。那時的我,像所有“小白”一樣,以為只要用心撰寫稿件,通過電子郵件發給各大媒體,就能收獲滿…

4 CSS的 變換、過渡與動畫

CSS3引入了變換、過渡和動畫特性&#xff0c;使得網頁可以呈現出豐富的視覺效果和交互體驗。通過這些新特性&#xff0c;開發者可以創建復雜的動畫效果&#xff0c;而不需要使用JavaScript。 4.1 變換&#xff08;Transforms&#xff09; 變換允許開發者對元素進行旋轉、縮放…

Python考試復習--day2

1.出租車計費 mile,waitmap(int,input().split(,)) if mile<3:money13wait*1 elif mile>3 and mile<15:money13(mile-3)*2.3wait*1 else:money1312*2.3(mile-15)*2.3*(10.5)wait*1 print({:.0f}.format(money)) 【知識點1】&#xff1a; map() 函數 【知識點1】&…

代碼隨想錄算法訓練營第五十一天|300.最長遞增子序列,674. 最長連續遞增序列,718. 最長重復子數組

300.最長遞增子序列 dp數組的含義為dp[i]表示字符串以第i位置為末尾的最長遞增子序列的長度。 for (int i 1; i < nums.size(); i) {for (int j 0; j < i; j) {if (nums[i] > nums[j]) dp[i] max(dp[i], dp[j] 1);}if (dp[i] > result) result dp[i]; // 取…

設計模式 20 中介者模式 Mediator Pattern

設計模式 20 中介者模式 Mediator Pattern 1.定義 中介者模式&#xff08;Mediator Pattern&#xff09;是一種行為型設計模式&#xff0c;它通過封裝對象之間的交互&#xff0c;促進對象之間的解耦合。中介者模式的核心思想是引入一個中介者對象&#xff0c;將系統中對象之間…

Vue中,點擊提交按鈕,路由多了個問號

問題 當點擊提交按鈕是路由多了問號&#xff1a; http://localhost:8100/#/ 變為 http://localhost:8100/?#/原因 路由中出現問號通常是由于某些路徑或參數處理不當造成的。在該情況下&#xff0c;是因為表單的默認行為導致的。提交表單時&#xff0c;如果沒有阻止表單的默…

React Router v6:路由管理的最新進展

React Router v6 是 React 應用程序路由管理的一個重大更新&#xff0c;它引入了許多改進和簡化&#xff0c;包括對嵌套路由的更友好處理&#xff0c;以及對鉤子函數的使用。 2500G計算機入門到高級架構師開發資料超級大禮包免費送&#xff01; 1. Routes 重構 在 v6 中&…

Kubernetes數據存儲

1. 數據存儲 容器的生命周期可能很短&#xff0c;會被頻繁地創建和銷毀。那么容器在銷毀時&#xff0c;保存在容器中的數據也會被清除。這種結果對用戶來說&#xff0c;在某些情況下是不樂意看到的。為了持久化保存容器的數據&#xff0c;kubernetes引入了Volume的概念。 Volu…

HTML-JavaWeb

目錄 1.標題排版 2.標題樣式 ?編輯 ?編輯 小結 3.超鏈接 4.正文排版 ?編輯?編輯?編輯5.正文布局 6.表格標簽 7.表單標簽 8.表單項標簽 1.標題排版 ● 圖片標簽 :< img> src:指定圖像的ur1(絕對路徑/相對路徑) width:圖像的寬度(像素/相對于父元素的百…

【AD21】文件的整理

當所有文件輸出完成后&#xff0c;需要對不同的文件去做一個整理&#xff0c;方便后續工作的交接。 在項目工程文件夾下新建名稱為BOM、SMT、PRJ、Gerber和DOC的文件夾。 BOM文件夾存放BOM表發給采購人員。SMT文件夾存放裝配圖文件和坐標文件發給貼片廠。PRJ文件夾存放工程文件…

C++基礎:多態

多態相關 多態繼承重寫父類的虛函數多態的體現,父類的引用指向子類對象的空間虛函數可以實現,也可以不實現,不實現必須要有初始值存在未定義的虛函數的類為抽象類.抽象類不能實例化對象;(animal父類不能實例化對象)如果父類中的函數非虛函數,則會調用父類中的函數//多態的體現…