在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

C++之父子之間沖突的解決方法

電子設計 ? 來源:電子設計 ? 作者:電子設計 ? 2020-12-24 15:59 ? 次閱讀

一、父子之間的沖突:

1、思考

子類中是否可以定義父類中的同名成員?

如果可以的話,那么該怎樣區分呢?

如果不可以的話,那么又是為啥呢?

代碼實踐:

#include <iostream>
#include <string>
using namespace std;
class Parent

public
int mi;
};
class Child : public Parent

public:
int mi;
};
int main()

Child c;

c.mi = 100; // mi 究竟是子類自定義的,還是從父類繼承得到的?

return 0;

代碼是否可以編譯通過,我們來看一下編譯器編譯的結果:

root@txp-virtual-machine:/home/txp# g++ test.cpp
root@txp-virtual-machine:/home/txp#

什么情況,居然可以編譯情況,但是你從肉眼看,你看出到底是父類mi還是子類的mi呢,顯然我們不能夠去瞎猜,那么接下來我們來學習里面的真理!

2、父子之間沖突的規則:

子類可以定義父類中的同名成員

子類中的成員將隱藏父類中的同名成員

父類中的同名成員依然存在于子類中

通過作用域分辨符(::)訪問父類中的同名成員,例如:

Child c;
c.mi = 100; //子類中的mi
c.Parent::mi = 1000; // 父類中的mi

代碼實踐:

#include <iostream>
#include <string>
using namespace std;
namespace A

int g_i = 0;

namespace B

int g_i = 1;// 同名的全局變量,但是位于兩個不同的命名空間;

class Parent

public:
int mi;

Parent()

cout << "Parent() : " << "&mi = " << &mi << endl;

};
class Child : public Parent

public:
int mi;

Child()

cout << "Child() : " << "&mi = " << &mi << endl;

};
int main()

Child c;

c.mi = 100;

c.Parent::mi = 1000;

cout << "&c.mi = " << &c.mi << endl;
cout << "c.mi = " << c.mi << endl;

cout << "&c.Parent::mi = " << &c.Parent::mi << endl;
cout << "c.Parent::mi = " << c.Parent::mi << endl;

return 0;

輸出結果:

root@txp-virtual-machine:/home/txp# g++ test.cpp
root@txp-virtual-machine:/home/txp# ./a.out
Parent() : &mi = 0x7ffc270e7bf0
Child() : &mi = 0x7ffc270e7bf4
&c.mi = 0x7ffc270e7bf4
c.mi = 100
&c.Parent::mi = 0x7ffc270e7bf0
c.Parent::mi = 1000

3、回顧重載:

(1)類中的成員函數可以進行重載

重載函數的本質為多個不同的函數

函數名和參數列表是唯一的標識

函數重載必須發生在同一個作用域中,這一點非常關鍵

(2)子類中定義的函數是否能夠重載父類中的同名函數呢?

代碼實踐:

#include <iostream>
#include <string>
using namespace std;
class Parent

public:
int mi;

void add(int v)

mi += v;


void add(int a, int b)

mi += (a + b);

};
class Child : public Parent

public:
int mi;

void add(int v)

mi += v;


void add(int a, int b)

mi += (a + b);


void add(int x, int y, int z)

mi += (x + y + z);

};
int main()

Child c;

c.mi = 100;

c.Parent::mi = 1000;

cout << "c.mi = " << c.mi << endl;

cout << "c.Parent::mi = " << c.Parent::mi << endl;

c.add(1);
c.add(2, 3);
c.add(4, 5, 6);

cout << "c.mi = " << c.mi << endl;

cout << "c.Parent::mi = " << c.Parent::mi << endl;

return 0;

結果輸出:

root@txp-virtual-machine:/home/txp# g++ test.cpp
root@txp-virtual-machine:/home/txp# ./a.out
c.mi = 100
c.Parent::mi = 1000
c.mi = 121
c.Parent::mi = 1000

注解:從實驗觀察來看,函數重名和成員重名的作用一樣,子類會覆蓋父類的。

為了更加說明這點,我們再來看一個示例:

#include <iostream>
#include <string>
using namespace std;
class Parent

public:
int mi;

void add(int v)

mi += v;


void add(int a, int b)

mi += (a + b);

};
class Child : public Parent

public:
int mi;



void add(int x, int y, int z)

mi += (x + y + z);

};
int main()

Child c;

c.mi = 100;

c.Parent::mi = 1000;

cout << "c.mi = " << c.mi << endl;

cout << "c.Parent::mi = " << c.Parent::mi << endl;

c.add(1);
c.add(2, 3);
c.add(4, 5, 6);

cout << "c.mi = " << c.mi << endl;

cout << "c.Parent::mi = " << c.Parent::mi << endl;

return 0;

編譯結果:

root@txp-virtual-machine:/home/txp# g++ test.cpp
test.cpp: In function ‘int main()’:
test.cpp:47:12: error: no matching function for call to ‘Child::add(int)’
c.add(1);

test.cpp:47:12: note: candidate is:
test.cpp:29:10: note: void Child::add(int, int, int)
void add(int x, int y, int z)

test.cpp:29:10: note: candidate expects 3 arguments, 1 provided
test.cpp:48:15: error: no matching function for call to ‘Child::add(int, int)’
c.add(2, 3);

test.cpp:48:15: note: candidate is:
test.cpp:29:10: note: void Child::add(int, int, int)
void add(int x, int y, int z)

test.cpp:29:10: note: candidate expects 3 arguments, 2 provided

注解:顯示匹配不到add(int)和add(int,int)這兩個函數

解決方案,就是利用作用域符分辨符解決問題:

#include <iostream>
#include <string>
using namespace std;
class Parent

public:
int mi;
void add(int v)

mi += v;

void add(int a, int b)

mi += (a + b);

};
class Child : public Parent

public:
int mi;
void add(int x, int y, int z)

mi += (x + y + z);

};
int main()

Child c;
c.mi = 100;
c.Parent::mi = 1000;
cout << "c.mi = " << c.mi << endl;
cout << "c.Parent::mi = " << c.Parent::mi << endl;
c.Parent::add(1);
c.Parent::add(2, 3);
c.add(4, 5, 6);
cout << "c.mi = " << c.mi << endl;
cout << "c.Parent::mi = " << c.Parent::mi << endl;
return 0;

輸出結果:

root@txp-virtual-machine:/home/txp# ./a.out
c.mi = 100
c.Parent::mi = 1000
c.mi = 115
c.Parent::mi = 1006

4、小結:

子類中的函數將隱藏父類的同名函數

子類無法重載父類中的成員函數(不在同一作用域里面)

使用作用域分辨符訪問父類中的同名函數

子類可以定義類中完全相同的成員函數

二、總結

子類可以定義父類中的同名成員

子類中的成員將隱藏父類中的同名成員

子類和父類中的函數不能構造重載關系

子類可以定義父類中完全相同的成員函數

使用作用域分辨符訪問父類中的同名成員或者函數

好了,今天的分享就到這里,如果文章中有錯誤或者不理解的地方,可以交流互動,一起進步。我是txp,下期見!

審核編輯:符乾江
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 可編程邏輯
    +關注

    關注

    7

    文章

    517

    瀏覽量

    44205
  • C++
    C++
    +關注

    關注

    22

    文章

    2114

    瀏覽量

    73965
收藏 人收藏

    評論

    相關推薦

    iic協議常見故障及解決方法

    SDA和時鐘線SCL)進行通信。I2C協議以其簡單性和低功耗特性,在嵌入式系統中得到了廣泛應用。 常見故障 通信失敗 原因 :可能是由于總線沖突、設備地址錯誤、數據線或時鐘線短路或斷路。 解決方法 :檢查總線連接,確保沒有短路或
    的頭像 發表于 02-05 11:38 ?284次閱讀

    Spire.XLS for C++組件說明

    Spire.XLS for C++ 是一款專業的 C++ Excel 組件,可以用在各種 C++ 框架和應用程序中。Spire.XLS for C++ 提供了一個對象模型 Excel
    的頭像 發表于 01-14 09:40 ?203次閱讀
    Spire.XLS for <b class='flag-5'>C++</b>組件說明

    電子焊接的常見問題及解決方法

    問題及解決方法: 焊點虛焊 原因分析 :虛焊是指焊點表面看似焊接良好,但實際上焊料與焊件之間沒有形成良好的冶金結合。虛焊的原因可能是焊接時間過短、焊接溫度過低、焊料質量差等. 解決方法 :延長焊接時間,確保焊料充分熔化
    的頭像 發表于 01-09 10:28 ?250次閱讀

    以太網組網常見故障及解決方法

    相互通信。 解決方法: 檢查網線是否損壞,使用網線測試儀進行測試。 確保網線插頭(RJ45)插入到位,沒有松動。 更換網線或接口,排除物理損壞的可能性。 檢查交換機和路由器的端口狀態,確保它們正常工作。 2. IP地址沖突 故障現象: 網絡中
    的頭像 發表于 11-08 09:13 ?1782次閱讀

    C語言和C++中結構體的區別

    同樣是結構體,看看在C語言和C++中有什么區別?
    的頭像 發表于 10-30 15:11 ?389次閱讀

    C7000優化C/C++編譯器

    電子發燒友網站提供《C7000優化C/C++編譯器.pdf》資料免費下載
    發表于 10-30 09:45 ?0次下載
    <b class='flag-5'>C</b>7000優化<b class='flag-5'>C</b>/<b class='flag-5'>C++</b>編譯器

    IP地址沖突解決方法圖示

    你是否在日常使用網絡時,有這樣的經歷:突然就失去網絡連接,時斷時續,加載緩慢,文件傳輸突然中斷?網絡連接并沒有完全斷開,但網速變得異常緩慢看電視劇卡頓、下載文件簡直龜速?那么你可能是IP地址沖突
    的頭像 發表于 07-26 11:51 ?569次閱讀

    C++語言基礎知識

    電子發燒友網站提供《C++語言基礎知識.pdf》資料免費下載
    發表于 07-19 10:58 ?8次下載

    C++中實現類似instanceof的方法

    函數,可實際上C++中沒有。但是別著急,其實C++中有兩種簡單的方法可以實現類似Java中的instanceof的功能。 在 C++ 中,確定對象的類型是編程中實際需求,使開發人員
    的頭像 發表于 07-18 10:16 ?697次閱讀
    <b class='flag-5'>C++</b>中實現類似instanceof的<b class='flag-5'>方法</b>

    鴻蒙OpenHarmony:【常見編譯問題和解決方法

    常見編譯問題和解決方法
    的頭像 發表于 05-11 16:09 ?2621次閱讀

    fsmc如何避免NE之間的訪問沖突?

    最近看了一些fsmc的資料,這樣的話如何避免NE之間的訪問沖突,請指點
    發表于 05-06 08:43

    鴻蒙OS開發實例:【Native C++

    使用DevEco Studio創建一個Native C++應用。應用采用Native C++模板,實現使用NAPI調用C標準庫的功能。使用C標準庫hypot接口計算兩個給定數平方和的平
    的頭像 發表于 04-14 11:43 ?2835次閱讀
    鴻蒙OS開發實例:【Native <b class='flag-5'>C++</b>】

    分析電源電感發熱解決方法

    電子發燒友網站提供《分析電源電感發熱解決方法.docx》資料免費下載
    發表于 03-29 14:39 ?3次下載

    使用 MISRA C++:2023? 避免基于范圍的 for 循環中的錯誤

    在前兩篇博客中,我們?向您介紹了新的 MISRA C++ 標準?和?C++ 的歷史?。在這篇博客中,我們將仔細研究以 C++ 中?for?循環為中心的特定規則。
    的頭像 發表于 03-28 13:53 ?892次閱讀
    使用 MISRA <b class='flag-5'>C++</b>:2023? 避免基于范圍的 for 循環中的錯誤

    EMI電磁干擾:原理、影響及解決方法詳解?

    EMI電磁干擾:原理、影響及解決方法詳解?|深圳比創達電子
    的頭像 發表于 03-21 10:02 ?1008次閱讀
    EMI電磁干擾:原理、影響及<b class='flag-5'>解決方法</b>詳解?
    主站蜘蛛池模板: 欧美啪啪小视频 | 日本大片免aaa费观看视频 | sss欧美一区二区三区 | 日韩欧免费一区二区三区 | 精品综合久久88色鬼首页 | 四虎影院观看视频在线观看 | 五月婷婷影视 | 激情五月激情综合网 | 亚洲国产精品综合久久久 | 欧美国产一区二区二区 | 五月婷婷激情网 | 国产美女作爱全过程免费视频 | 成人国产精品一级毛片视频 | 国产一级特黄aa级特黄裸毛片 | 亚洲午夜久久久精品影院视色 | 中文一区二区 | 男男生子大肚play做到生 | www在线视频在线播放 | 中国男女全黄大片一级 | 亚色网站| 久久精品亚洲一区二区三区浴池 | 成人a毛片视频免费看 | 关晓彤被调教出奶水的视频 | 国产农村三片免费网站 | 午夜美女影院 | 国产午夜在线观看 | 羞羞漫画喷水漫画yy漫画 | 国产精欧美一区二区三区 | 天天色天天舔 | 性欧美高清极品猛交 | 色综久久 | 久久综合香蕉久久久久久久 | 欧美网站黄 | 国产传媒在线观看视频免费观看 | 男人的午夜 | 黄色大毛片| 另类五月 | 亚洲美女视频在线观看 | 亚洲久优优色优在线播放 | 国内一级特黄女人精品毛片 | 欧美日本俄罗斯一级毛片 |