一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

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

    文章

    526

    瀏覽量

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

    關(guān)注

    22

    文章

    2119

    瀏覽量

    75210
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    使用C++中的CyAPI編寫的應(yīng)用程序上遇到了問題,求解決

    我在使用 C++ 中的 CyAPI 編寫的應(yīng)用程序上遇到了問題。 我將 XferData() 方法與其他所有端點類型一起使用,沒有遇到任何問題。 但是,將其與 Endpoint0 一起使用會引發(fā)
    發(fā)表于 05-13 06:11

    iic協(xié)議常見故障及解決方法

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

    無功補(bǔ)償故障原因及解決方法

    無功補(bǔ)償故障可能由多種原因引起,以下是一些常見的故障原因及其解決方法
    的頭像 發(fā)表于 01-29 14:25 ?1360次閱讀

    Spire.XLS for C++組件說明

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

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

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

    伺服電機(jī)常見故障及解決方法有哪些

    伺服電機(jī)在運行過程中可能會遇到多種故障,以下是一些常見故障及其解決方法: 一、伺服電機(jī)不轉(zhuǎn)動 故障原因 : 電源未連接或接觸不良。 驅(qū)動器與電機(jī)之間的連接線斷裂或接觸不良。 驅(qū)動器故障。 電機(jī)故障
    的頭像 發(fā)表于 11-20 09:48 ?4312次閱讀

    C7000 C/C++優(yōu)化指南用戶手冊

    電子發(fā)燒友網(wǎng)站提供《C7000 C/C++優(yōu)化指南用戶手冊.pdf》資料免費下載
    發(fā)表于 11-09 15:00 ?0次下載
    <b class='flag-5'>C</b>7000 <b class='flag-5'>C</b>/<b class='flag-5'>C++</b>優(yōu)化指南用戶手冊

    以太網(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 ?3059次閱讀

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

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

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

    電子發(fā)燒友網(wǎng)站提供《C7000優(yōu)化C/C++編譯器.pdf》資料免費下載
    發(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>編譯器

    CAN盒指示燈不亮的解決方法

    CAN盒指示燈不亮可能有多種原因,以下是一些常見的解決方法。
    的頭像 發(fā)表于 09-20 14:53 ?1838次閱讀

    IP地址沖突解決方法圖示

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

    OpenVINO2024 C++推理使用技巧

    很多人都使用OpenVINO新版的C++ 或者Python的SDK,都覺得非常好用,OpenVINO2022之后的版本C++ SDK做了大量的優(yōu)化與整理,已經(jīng)是非常貼近開發(fā)的使用習(xí)慣與推理方式。與OpenCV的Mat對象對接方式更是幾乎無縫對接,非常的方便好用。
    的頭像 發(fā)表于 07-26 09:20 ?1554次閱讀

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

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

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

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