C++ 作用域分辨符

注意:本文中代碼均使用 Qt 開發(fā)編譯環(huán)境

作用域分辨符纸兔,就是經(jīng)常見到的“::”舆逃,他可以用來限定要訪問的成員所在的類的名稱伤疙,一般形式是:

基類名::成員名; // 數(shù)據(jù)成員
基類名::成員名(參數(shù)表); // 函數(shù)成員

在沒有虛函數(shù)的情況下兵睛,如果派生類中聲明了與基類成員函數(shù)同名的新函數(shù),即使函數(shù)的參數(shù)表不相同奋渔,從基類繼承的同名函數(shù)的所有重載形式也都會被隱藏。如果想要訪問被隱藏的成員壮啊,就需要使用作用域分辨符和基類名來限定嫉鲸。

在沒有虛函數(shù)的情況下,如果某個派生類的多個基類擁有同名的成員歹啼,同時玄渗,派生類又新增這樣的同名成員,在這種情況下狸眼,派生類成員將隱藏所有基類同名成員藤树。這時使用“對象名.成員名”方式可以唯一標識和訪問派生類新增成員,基類同名成員也可以拓萌。

但是如果派生類在多繼承的時候岁钓,沒有聲明這樣新的同名成員。這時就必須通過使用基類名和作用域分辨符來標識成員微王。

示例:

#include <QCoreApplication>
#include <QDebug>

class B1 {

public:
    int nV;
    void fun(){qDebug()<<"Memberof B1"<<", nV = "<<nV;}
};

class B2 {

public:
    int nV;
    void fun(){qDebug()<<"Memberof B2"<<", nV = "<<nV;}
};

class C : public B1, public B2 {

public:
    int nV;
    void fun(){qDebug()<<"Memberof C"<<", nV = "<<nV;}
};

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    C c1;

    c1.nV = 1;
    c1.fun();

    c1.B1::nV = 2;
    c1.B1::fun();
    c1.fun();

    c1.B2::nV = 3;
    c1.B2::fun();
    c1.fun();

    return a.exec();
}

示例運行結(jié)果:


運行結(jié)果

通過作用域分辨符屡限,就明確地唯一標識了派生類中由基類所繼承來的成員,達到訪問的目的炕倘,解決了成員被隱藏的問題钧大。

如果派生類沒有聲明新的與基類同名的成員。

例如罩旋,將上例中的派生類C啊央,改為如下形式:

class C : public B1, public B2 {
};

再次,運行會出現(xiàn)報錯:


錯誤信息

我們注釋掉會導致出錯的代碼瘸恼,再次運行劣挫,輸出結(jié)果:


注釋錯誤代碼后的輸出

如果某個派生類的部分或者全部直接基類是從另一個共同的基類派生而來,在這些直接基類中东帅,從上一級基類繼承來的成員就擁有相同的名稱压固,因此派生類中也就會產(chǎn)生同名現(xiàn)象,對這種類型的同名成員也要使用作用域分辨符來唯一標識靠闭,而且必須用直接基類來進行界定帐我。

#include <QCoreApplication>
#include <QDebug>

class B0 {
public:
    int nV = 0;
    void fun(){qDebug()<<"Memberof B0 and nV = "<<nV;}
};

class B1:public B0 {
public:
    int nV1;
};

class B2:public B0 {
public:
    int nV2;
};

class C:public B1, public B2 {
public:
    int nVd;
    void fun(){qDebug()<<"Memberof C";}
};

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    C c1;
    c1.B1::nV = 2;
    c1.B1::fun();
    c1.B2::nV = 3;
    c1.B2::fun();
    c1.B1::fun();

    return a.exec();
}

運行結(jié)果:

運行結(jié)果

在例子中可以看出坎炼,在這種情況下,派生類的對象在內(nèi)存中就同時擁有成員nV及fun的兩份同名拷貝拦键。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末谣光,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子芬为,更是在濱河造成了極大的恐慌萄金,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,907評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件媚朦,死亡現(xiàn)場離奇詭異氧敢,居然都是意外死亡,警方通過查閱死者的電腦和手機询张,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評論 3 395
  • 文/潘曉璐 我一進店門孙乖,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人份氧,你說我怎么就攤上這事唯袄。” “怎么了蜗帜?”我有些...
    開封第一講書人閱讀 164,298評論 0 354
  • 文/不壞的土叔 我叫張陵恋拷,是天一觀的道長。 經(jīng)常有香客問我钮糖,道長梅掠,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,586評論 1 293
  • 正文 為了忘掉前任店归,我火速辦了婚禮,結(jié)果婚禮上酪我,老公的妹妹穿的比我還像新娘消痛。我一直安慰自己,他們只是感情好都哭,可當我...
    茶點故事閱讀 67,633評論 6 392
  • 文/花漫 我一把揭開白布秩伞。 她就那樣靜靜地躺著,像睡著了一般欺矫。 火紅的嫁衣襯著肌膚如雪纱新。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,488評論 1 302
  • 那天穆趴,我揣著相機與錄音脸爱,去河邊找鬼。 笑死未妹,一個胖子當著我的面吹牛簿废,可吹牛的內(nèi)容都是我干的空入。 我是一名探鬼主播,決...
    沈念sama閱讀 40,275評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼族檬,長吁一口氣:“原來是場噩夢啊……” “哼歪赢!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起单料,我...
    開封第一講書人閱讀 39,176評論 0 276
  • 序言:老撾萬榮一對情侶失蹤埋凯,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后扫尖,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體白对,經(jīng)...
    沈念sama閱讀 45,619評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,819評論 3 336
  • 正文 我和宋清朗相戀三年藏斩,在試婚紗的時候發(fā)現(xiàn)自己被綠了躏结。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,932評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡狰域,死狀恐怖媳拴,靈堂內(nèi)的尸體忽然破棺而出跨嘉,到底是詐尸還是另有隱情侵佃,我是刑警寧澤,帶...
    沈念sama閱讀 35,655評論 5 346
  • 正文 年R本政府宣布姐扮,位于F島的核電站抬探,受9級特大地震影響子巾,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜小压,卻給世界環(huán)境...
    茶點故事閱讀 41,265評論 3 329
  • 文/蒙蒙 一线梗、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧怠益,春花似錦仪搔、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,871評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至抢呆,卻和暖如春煮嫌,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背抱虐。 一陣腳步聲響...
    開封第一講書人閱讀 32,994評論 1 269
  • 我被黑心中介騙來泰國打工昌阿, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 48,095評論 3 370
  • 正文 我出身青樓宝泵,卻偏偏與公主長得像好啰,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子儿奶,可洞房花燭夜當晚...
    茶點故事閱讀 44,884評論 2 354

推薦閱讀更多精彩內(nèi)容