色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

    文章

    516

    瀏覽量

    44105
  • C++
    C++
    +關注

    關注

    22

    文章

    2110

    瀏覽量

    73696
收藏 人收藏

    評論

    相關推薦

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

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

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

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

    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 ?457次閱讀

    C++語言基礎知識

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

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

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

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

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

    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 ?2674次閱讀
    鴻蒙OS開發實例:【Native <b class='flag-5'>C++</b>】

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

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

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

    EMI電磁干擾:原理、影響及解決方法詳解?|深圳比創達電子
    的頭像 發表于 03-21 10:02 ?897次閱讀
    EMI電磁干擾:原理、影響及<b class='flag-5'>解決方法</b>詳解?

    c語言,c++,java,python區別

    C語言、C++、Java和Python是四種常見的編程語言,各有優點和特點。 C語言: C語言是一種面向過程的編程語言。它具有底層的特性,能夠對計算機硬件進行直接操作。
    的頭像 發表于 02-05 14:11 ?2446次閱讀

    局域網IP地址沖突、環路的罪魁禍首是什么?

    、影響以及解決方法。 一、局域網IP地址沖突 局域網IP地址沖突指的是在同一個局域網中,多個設備使用了相同的IP地址,這會導致通信混亂和網絡故障。常見的原因包括以下幾種: 1. 手動設置IP地址錯誤:在手動設置設備的IP地址時,
    的頭像 發表于 02-04 11:03 ?4762次閱讀

    如何解決C語言中的“訪問權限沖突”異常?C語言引發異常原因分析

    一些措施來解決和防止其發生。本文將詳細介紹C語言中訪問權限沖突異常的原因以及解決方法。 一、訪問權限沖突異常的原因分析 訪問權限沖突異常可分
    的頭像 發表于 01-12 16:03 ?5846次閱讀

    C++簡史:C++是如何開始的

    MISRA C++:2023,MISRA? C++ 標準的下一個版本,來了!為了幫助您做好準備,我們介紹了 Perforce 首席技術支持工程師 Frank van den Beuken 博士撰寫
    的頭像 發表于 01-11 09:00 ?620次閱讀
    <b class='flag-5'>C++</b>簡史:<b class='flag-5'>C++</b>是如何開始的
    主站蜘蛛池模板: jlzzzjizzzjlzzz亚洲| 国精产品一区一区三区M| 久久人人玩人妻潮喷内射人人| 亚洲午夜精品A片久久软件 | 国产精品久久人妻互换毛片| 亚洲精品乱码电影在线观看| 久久99r66热这里有精品| 97视频在线观看视频最新| 日本女人bbb| 国内精品国内自产视频| 538在线播放| 色多多污污在线观看网站| 河南老太XXXXXHD| 99这里只有是精品2| 性欧美videosex18嫩| 麻豆精选2021| 国产精品 日韩精品 欧美| 玉娇龙续集春雪瓶txt免费阅读| 欧美xxxxxbb| 娇女的呻吟亲女禁忌h16| ebc5恐怖5a26房间| 亚洲精品AV一二三区无码| 牛牛免费视频| 国产婷婷一区二区在线观看| 99爱在线精品视频免费观看9| 挺进绝色老师的紧窄小肉六| 久久亚洲精品成人综合| 国产电影三级午夜a影院| 8x8x我要打机飞在线观看| 午夜想想爱| 强伦姧久久久久久久久久| 和尚扒开双腿蹂躏| 成激人情在线影院920| 一个人免费观看在线视频播放 | 理论片87福利理论电影| 国产一级做a爰片久久毛片男| yellow片在线观看免费观看动漫| 亚洲欧洲日本无在线码播放 | 草莓视频app深夜福利| 淫品色影院| 亚洲不卡高清免v无码屋|