0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

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

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

一、父子之間的沖突:

1、思考

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

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

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

代碼實踐:

#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;

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

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

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

2、父子之間沖突的規(guī)則:

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

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

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

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

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;

輸出結(jié)果:

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)類中的成員函數(shù)可以進(jìn)行重載

重載函數(shù)的本質(zhì)為多個不同的函數(shù)

函數(shù)名和參數(shù)列表是唯一的標(biāo)識

函數(shù)重載必須發(fā)生在同一個作用域中,這一點非常關(guān)鍵

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

代碼實踐:

#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.a(chǎn)dd(1);
c.a(chǎn)dd(2, 3);
c.a(chǎn)dd(4, 5, 6);

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

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

return 0;

結(jié)果輸出:

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

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

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

#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.a(chǎn)dd(1);
c.a(chǎn)dd(2, 3);
c.a(chǎn)dd(4, 5, 6);

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

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

return 0;

編譯結(jié)果:

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.a(chǎn)dd(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.a(chǎn)dd(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)這兩個函數(shù)

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

#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.a(chǎn)dd(4, 5, 6);
cout << "c.mi = " << c.mi << endl;
cout << "c.Parent::mi = " << c.Parent::mi << endl;
return 0;

輸出結(jié)果:

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

4、小結(jié):

子類中的函數(shù)將隱藏父類的同名函數(shù)

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

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

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

二、總結(jié)

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

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

子類和父類中的函數(shù)不能構(gòu)造重載關(guān)系

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

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

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

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

    關(guān)注

    7

    文章

    516

    瀏覽量

    44123
  • C++
    C++
    +關(guān)注

    關(guān)注

    22

    文章

    2113

    瀏覽量

    73742
收藏 人收藏

    評論

    相關(guān)推薦

    Spire.XLS for C++組件說明

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

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

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

    以太網(wǎng)組網(wǎng)常見故障及解決方法

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

    C語言和C++中結(jié)構(gòu)體的區(qū)別

    同樣是結(jié)構(gòu)體,看看在C語言和C++中有什么區(qū)別?
    的頭像 發(fā)表于 10-30 15:11 ?302次閱讀

    C7000優(yōu)化C/C++編譯器

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

    IP地址沖突解決方法圖示

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

    C++語言基礎(chǔ)知識

    電子發(fā)燒友網(wǎng)站提供《C++語言基礎(chǔ)知識.pdf》資料免費(fèi)下載
    發(fā)表于 07-19 10:58 ?7次下載

    C++中實現(xiàn)類似instanceof的方法

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

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

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

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

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

    鴻蒙OS開發(fā)實例:【Native C++

    使用DevEco Studio創(chuàng)建一個Native C++應(yīng)用。應(yīng)用采用Native C++模板,實現(xiàn)使用NAPI調(diào)用C標(biāo)準(zhǔn)庫的功能。使用C標(biāo)準(zhǔn)庫hypot接口計算兩個給定數(shù)平方和的平
    的頭像 發(fā)表于 04-14 11:43 ?2703次閱讀
    鴻蒙OS開發(fā)實例:【Native <b class='flag-5'>C++</b>】

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

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

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

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

    c語言,c++,java,python區(qū)別

    C語言、C++、Java和Python是四種常見的編程語言,各有優(yōu)點和特點。 C語言: C語言是一種面向過程的編程語言。它具有底層的特性,能夠?qū)τ嬎銠C(jī)硬件進(jìn)行直接操作。
    的頭像 發(fā)表于 02-05 14:11 ?2506次閱讀

    局域網(wǎng)IP地址沖突、環(huán)路的罪魁禍?zhǔn)资鞘裁矗?/a>

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