欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++多重繼承二義性原理實(shí)例解析

 更新時(shí)間:2020年06月25日 11:18:40   作者:知道了呀  
這篇文章主要介紹了C++多重繼承二義性原理實(shí)例解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

在派生類中對(duì)基類成員訪問(wèn)應(yīng)該是唯一的,但是在多繼承時(shí),可能會(huì)導(dǎo)致對(duì)基類某成員訪問(wèn)出現(xiàn)不一致的情況,這就是C++多繼承中的二義性。

有兩種繼承的情況會(huì)產(chǎn)生多義性

一、如果一個(gè)派生類從多個(gè)基類派生,而這些基類又有一個(gè)共同的基類,則在對(duì)該基類中聲明的成員變量進(jìn)行訪問(wèn)時(shí),可能產(chǎn)生二義性,繼承關(guān)系如下圖所示:

#include <iostream>
using namespace std;
 
class A{
public:
  int a;
};
 
class B1 : public A{
public:
  int b1;
};
 
class B2 : public A{
public:
  int b2;
};
 
class C : public B1, public B2{
public:
  int c;
};
int main(){
  C c1;
  c1.b1 = 100;
  c1.b2 = 200;
  c1.c = 300;
 
  c1.a = 500; //報(bào)錯(cuò),不能確定成員變量a具體在那個(gè)類
 
  cout << "end..." << endl;
  system("pause");
  return 0;
}

解決方法:虛繼承

注意:C++編譯系統(tǒng)在實(shí)例化C類時(shí),只會(huì)將虛基類A的構(gòu)造函數(shù)調(diào)用一次,忽略虛基類的其他派生類(class B1,class B2)對(duì)虛繼承的構(gòu)造函數(shù)的調(diào)用,從而保證了虛基類的數(shù)據(jù)成員不會(huì)被多次初始化。

在虛基類A中有一個(gè)虛指針指向一個(gè)虛表,虛表中記錄了虛基類與本類的地址偏移,通過(guò)這個(gè)地址偏移可以找到虛基類的成員變量a的地址

#include <iostream>
using namespace std;
 
class A{
public:
  int a;
};
 
class B1 : virtual public A{
public:
  int b1;
};
 
class B2 : virtual public A{
public:
  int b2;
};
 
class C : public B1, public B2{
public:
  int c1;
};
 
int main(){
  C c1;
  c1.b1 = 100;
  c1.b2 = 200;
  c1.c1 = 300;
 
  c1.a = 500; //虛繼承使得成員變量a只有一份拷貝,通過(guò)虛指針可以確定地址
 
  cout << "end..." << endl;
  system("pause");
  return 0;
}

二、一個(gè)派生類同時(shí)繼承兩個(gè)基類,這兩個(gè)基類存在相同的成員函數(shù)

#include<iostream>
using namespace std;
 
 
class Base1 {
public:
  void fun() {
    cout << "I am base-1 " << endl;
  };
};
 
class Base2
{
public:
  void fun() {
    cout << "I am base-2 " << endl;
  };
};
 
class A: public Base1, public Base2 {
public:
  void print() {
  }
};
 
int main() {
  A obj;
  obj.fun();  //調(diào)用的方法產(chǎn)生歧義
  system("pause");
  return 0;
}

解決方法:使用作用域運(yùn)算符::來(lái)解決,明確指向的方法,例如obj.Base1::fun()

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 淺談幾種常見(jiàn)語(yǔ)言的命名空間(Namespace)

    淺談幾種常見(jiàn)語(yǔ)言的命名空間(Namespace)

    本文給大家簡(jiǎn)單介紹了下幾種常見(jiàn)語(yǔ)言的命名空間的特性以及簡(jiǎn)單示例,大家對(duì)比下,有需要的小伙伴可以參考下
    2016-03-03
  • C++ 大根堆排序?qū)W習(xí)筆記

    C++ 大根堆排序?qū)W習(xí)筆記

    這篇文章主要為大家介紹了C++ 大根堆排序的學(xué)習(xí)教程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-10-10
  • C語(yǔ)言超細(xì)致講解函數(shù)遞歸

    C語(yǔ)言超細(xì)致講解函數(shù)遞歸

    程序調(diào)???的編程技巧稱為遞歸?recursion)函數(shù)??調(diào)???就是遞歸,你也可以理解成是?種嵌套結(jié)構(gòu),但遞歸分為倆部分,第?是“遞”,進(jìn)?嵌套結(jié)構(gòu)。第?是”歸“,最終會(huì)?步?步返回。第?次接觸遞歸都會(huì)很懵,慢慢理解這個(gè)過(guò)程就明?了
    2022-05-05
  • C++常用的#include頭文件總結(jié)

    C++常用的#include頭文件總結(jié)

    這篇文章主要介紹了C++常用的#include頭文件,對(duì)初學(xué)者理解C++程序設(shè)計(jì)大有好處的相關(guān)資料
    2014-07-07
  • c語(yǔ)言中main函數(shù)用法及知識(shí)點(diǎn)總結(jié)

    c語(yǔ)言中main函數(shù)用法及知識(shí)點(diǎn)總結(jié)

    在本篇文章里小編給大家分享的是一篇關(guān)于c語(yǔ)言中main函數(shù)用法及知識(shí)點(diǎn)總結(jié)內(nèi)容,有需要的朋友們可以跟著學(xué)習(xí)參考下。
    2021-10-10
  • C語(yǔ)言實(shí)現(xiàn)ATM系統(tǒng)程序的完整代碼

    C語(yǔ)言實(shí)現(xiàn)ATM系統(tǒng)程序的完整代碼

    這篇文章主要介紹了C語(yǔ)言實(shí)現(xiàn)ATM系統(tǒng)程序的完整代碼,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-05-05
  • 簡(jiǎn)述C++的復(fù)雜性

    簡(jiǎn)述C++的復(fù)雜性

    這篇文章主要介紹了簡(jiǎn)述C++的復(fù)雜性,幫助大家更好的理解和認(rèn)識(shí)c++編程語(yǔ)言,感興趣的朋友可以了解下
    2020-08-08
  • Linux 軟件看門狗 watchdog使用介紹

    Linux 軟件看門狗 watchdog使用介紹

    這篇文章主要介紹了Linux 軟件看門狗 watchdog使用介紹,需要的朋友可以參考下
    2016-10-10
  • C++詳解鏈棧的實(shí)現(xiàn)

    C++詳解鏈棧的實(shí)現(xiàn)

    今天我們學(xué)習(xí)的是鏈棧,也就是說(shuō)棧的鏈?zhǔn)浇Y(jié)構(gòu),我們運(yùn)用順序鏈的方式來(lái)實(shí)現(xiàn)。首先呢,鏈棧是不存在存儲(chǔ)空間滿的情況的,所以可以說(shuō)它是個(gè)無(wú)底洞,然而我們之前學(xué)的順序棧是有額定空間的
    2022-06-06
  • C++數(shù)據(jù)結(jié)構(gòu)模板進(jìn)階的多方面分析

    C++數(shù)據(jù)結(jié)構(gòu)模板進(jìn)階的多方面分析

    今天我要給大家介紹C++中的模板更深的一些知識(shí)。有關(guān)于非類型的模板參數(shù)和模板特化的一些知識(shí),感興趣的朋友快來(lái)看看吧
    2022-02-02

最新評(píng)論