亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

C++繼承的驗證

2020-02-24 14:37:28
字體:
來源:轉載
供稿:網友

C++++繼承的驗證,何為繼承?為啥C++需要繼承,我們得理解清楚先,C++繼承可以是單一繼承或多重繼承,每一個繼承連接可以是public,protected,private也可以是virtual或non-virtual,本文作出一些關鍵點的驗證,一起來了解。

  public繼承,例如下:


?class base
?{...}
?class derived:public base
?{...}  


如果這樣寫,編譯器會理解成類型為derived的對象同時也是類型為base的對象,但類型為base的對象不是類型為derived的對象。這點很重要。那么函數形參為base類型適用于derived,形參為derived不適用于base。下面是驗證代碼,一個參數為base的函數,傳入derived應該成功執行,相反,一個參數為derived的函數

?

?


?#include
? #include

? class base
? {
????? public:
????? base()
????? :baseName(""),baseData(0)
????? {}

???? base(std::string bn,int bd)
???? :baseName(bn),baseData(bd)
???? {}

???? std::string getBaseName() const
???? {
???????? return baseName;
???? }

???? int getBaseData()const
???? {
???????? return baseData;
???? }

???? private:
???????? std::string baseName;
???????? int baseData;
?};

?class derived:public base
?{
???? public:
???????? derived():base(),derivedName("")
???????? {}
???????? derived(std::string bn,int bd,std::string dn)
???????? :base(bn,bd),derivedName(dn)
???????? {}
???????? std::string getDerivedName() const
???????? {
???????????? return derivedName;
???????? }
???? private:
???????? std::string derivedName;
?};

?void show(std::string& info,const base& b)
?{
???? info.append("Name is ");
???? info.append(b.getBaseName());
???? info.append(", baseData is ");
???? char buffer[10];
???? sprintf(buffer,"%d",b.getBaseData());
???????? info.append(buffer);
?}

?int main(int argc,char* argv[])
?{
???? base b("test",10);
???? std::string s;
???? show(s,b);
???? std::cout???? derived d("btest",5,"dtest");
???? std::string ss;
???? show(ss,d);
???? std::cout???? return 0;
?}


運行結果為:

?

base:baseName is test, baseData is 10
base:baseName is btest, baseData is 5

下面改改代碼,將函數參數變為derived


void show2(std::string& info,const derived& d)
{
??? info.append("Name is ");
??? info.append(d.getBaseName());
??? info.append(", baseData is ");
??? char buffer[10];
??? sprintf(buffer,"%d",d.getBaseData());
??? info.append(buffer);
}


調用show(ss,d);編譯器報錯

?

?


?derived_class.cpp: In function `int main(int, char**)':
?derived_class.cpp:84: error: invalid initialization of reference of type 'const derived&' from expression of type 'base'
?derived_class.cpp:70: error: in passing argument 2 of `void show2(std::string&, const derived&)'第二點對各種形式的繼承作出驗證,首先給出表格

?

?

?

繼承方式/成員類型 public protected private
public public protected 無法繼承
protected protected protected 無法繼承
private private private 無法繼承

?

這里解釋一下,這里僅僅表達基類的成員,被public,protected,private三種方式繼承后,在原基類為public,protectedc,private的成員在繼承類里類型為表格里內容

?


class base
{
??? public:
??????? std::string testPublic()
??????? {
??????????? return std::string("this is public base");
??????? }
??? protected:
??????? std::string testProtected()
?????? {
?????????? return std::string("this is protected base");
?????? }
?? private:
?????? std::string testPrivate()
?????? {
?????????? return std::string("this is private base");
?????? }
};
class derivedPublic:public base
{
?? public:
?????? std::string testPubPublic()
?????? {
?????????? return testPublic()+= "in derived";
?????? }
?????? std::string testProPublic()
?????? {???
?????????? return testProtected()+= "in derived";
?????? }
?????? std::string testPriPublic()??????????????????
?????? {???
?????????? return testPrivate()+= "in derived";
?????? }
};
int main(int argc,char* argv[])

?? derivedPublic dpub;
?? std::cout }


報下面錯誤,說明testPrivate()不是derived私有函數而是base的私有函數
derived11.cpp:16: error: `std::string base::testPrivate()' is private
derived11.cpp:36: error: within this context這樣驗證private類型成員無法被繼承(public,private,protected)注:private,protected略去不做證明
下面只要驗證 testProtected 能被第三層繼承類繼承,但是無法被第三層類直接調用就說明是public繼承后繼承類型為protected,而基類為Public類型成員則即可被繼承又可以直接調用。

?

?


?#include
?#include

?class base
?{
???? public:
???????? std::string testPublic()
???????? {
???????????? return std::string("this is public base");
??????? }
??? protected:
??????? std::string testProtected()
??????? {
??????????? return std::string("this is protected base");
??????? }
??? private:
??????? std::string testPrivate()
??????? {
??????????? return std::string("this is private base");
??????? }
};

?

class derivedPublic:public base
{
??? public:
??????? std::string testPubPublic()
??????? {
??????????? return testPublic()+= "in derived";
??????? }

??????? std::string testProPublic()
??????? {???
??????????? return testProtected()+= "in derived";
??????? }

//??????? std::string testPriPublic()??????????????????
//??????? {???
//??????????? return testPrivate()+= "in derived";
//??????? }
};

class deepDerived:public derivedPublic
{
??? public:
??????? std::string deepProtected()
??????? {
??????????? return testProtected() +="in deep";
??????? }

??????? std::string deepPublic()
??????? {
??????????? return testPublic() +="indeep";
??????? }
};

int main(int argc,char* argv[])
{
??? derivedPublic dpub;
??? std::cout ??? deepDerived deepdpub;
??? std::cout??? std::cout??? std::cout??? std::cout}


這里服務器報錯

?

derived12.cpp:13: error: `std::string base::testProtected()' is protected
derived12.cpp:62: error: within this context這樣就驗證了一個是public,一個是protected,protected是不能直接調用的,但是被繼承后是可以被public成員調用的。
下面的已經證明,詳細步驟就略去如果對該部分驗證感興趣,可以看下面代碼。


?#include
?2 #include
?3 class base
?4 {
?5???? public:
?6???????? std::string testPublic()
?7???????? {
?8???????????? return std::string("this is public base");
?9???????? }
???? protected:
???????? std::string testProtected()
???????? {
???????????? return std::string("this is protected base");
???????? }
???? private:
???????? std::string testPrivate()
???????? {
???????????? return std::string("this is private base");
???????? }
?};

?class derivedPublic:public base
?{
???? public:
???????? std::string testPubPublic()
???????? {
???????????? return testPublic()+= "in derived";
???????? }

???????? std::string testProPublic()
???????? {???
???????????? return testProtected()+= "in derived";
???????? }

?//??????? std::string testPriPublic()?????????????????? //私有成員并沒有被繼承下來
?//??????? {???
?//??????????? return testPrivate()+= "in derived";
?//??????? }
?};

?class deepDerived:public derivedPublic
?{
???? public:
???????? std::string test()
???????? {
???????????? return testPublic() +="in 3";
???????? }
?};

?class derivedProtected:protected base
?{
???? public:
???????? std::string testPubProtected()
???????? {
???????????? return testPublic()+= "in derived";
???????? }

???????? std::string testProProtected()
???????? {???
???????????? return testProtected()+= "in derived";
???????? }
?};

?class deepDerived2:public derivedProtected
?{
???? public:
???????? std::string test()
???????? {
???????????? return testPublic() +="in 3";
???????? }
?};

?class derivedPrivate:private base
?{
???? public:
???????? std::string testPubPirvate()
???????? {
???????????? return testPublic()+= "in derived";
???????? }

???????? std::string testProPrivate()
???????? {???
???????????? return testProtected()+= "in derived";
???????? }

?};

?//class deepDerived3:public derivedPrivate
?//{
?//??? public:
?//??????? std::string test()
?//??????? {
?//??????????? return testPublic() +="in 3";
?//??????? }
?//};

?int main(int argc,char* argv[])
?{
???? derivedPublic dpub;
??? //derivedProtected dpro;
??? //derivedPrivate dpri;
??? std::cout??? //std::cout??? //cout??? std::cout??? std::cout??? //std::cout
??? deepDerived dd;
??? std::cout
??? derivedProtected dpro;
??? //std::cout??? std::cout??? std::cout
??? deepDerived2 dd2;
??? std::cout
??? derivedPrivate dpri;
??? std::cout??? std::cout
//??? deepDerived3 dd3;
//??? std::cout}

小編帶來的這篇C++繼承的驗證,是不是特別的實用呢,更多關于C++的內容,可以多多關注下武林技術頻道。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品一区二区三区久久久| 日本精品久久久| 国产精品久久久久久av福利软件| 欧美一区二区影院| 国产一区二区在线免费| 欧美精品一本久久男人的天堂| 黑人狂躁日本妞一区二区三区| 成人激情春色网| 尤物yw午夜国产精品视频| 国产精品久久久久久久久久免费| 久久免费高清视频| 红桃视频成人在线观看| 精品久久久久久久久久| 国内免费精品永久在线视频| 久久亚洲综合国产精品99麻豆精品福利| 欧美在线视频免费观看| 一区二区成人av| 精品成人69xx.xyz| 久久精品在线视频| 国产999视频| 国产精品久久久久久超碰| 国产午夜精品全部视频播放| 国产不卡在线观看| 成人欧美一区二区三区黑人| 国产精品永久免费观看| 久久久久久12| 成人免费激情视频| 91精品久久久久久久久久久久久| 亚洲aⅴ男人的天堂在线观看| 中文字幕av一区二区三区谷原希美| 在线观看国产精品日韩av| 久久久最新网址| 中文字幕不卡在线视频极品| 欧美电影免费观看高清| 一本色道久久综合狠狠躁篇的优点| 91香蕉嫩草神马影院在线观看| 俺去啦;欧美日韩| 亚洲自拍高清视频网站| 中文欧美在线视频| 亚洲国产成人爱av在线播放| 欧美色另类天堂2015| 蜜臀久久99精品久久久久久宅男| 日韩美女av在线| 成人乱色短篇合集| 91精品国产91久久久| 久久天天躁狠狠躁夜夜av| 欧美精品在线视频观看| 中文字幕久久精品| 国产精品视频yy9099| 91在线精品视频| 亚洲激情在线视频| 国产精品亚洲激情| 91丨九色丨国产在线| 亚洲大胆人体在线| 日韩av在线免费观看一区| 亚洲国语精品自产拍在线观看| 97精品国产91久久久久久| 欧美午夜www高清视频| 成人免费看黄网站| 欧美日韩国产综合新一区| 久久久久久久97| 欧美疯狂性受xxxxx另类| 精品久久久久久久久久ntr影视| 日韩在线视频网站| 一道本无吗dⅴd在线播放一区| 国产精品免费电影| 国产精品久久久久久久天堂| 亚洲国产私拍精品国模在线观看| 91国自产精品中文字幕亚洲| 精品一区电影国产| 欧美丝袜第一区| 欧美激情喷水视频| 久久99国产综合精品女同| 欧美成人在线免费视频| 精品久久久久久久久久久久| 欧美裸体xxxxx| 国外色69视频在线观看| 国产午夜精品全部视频在线播放| 爱福利视频一区| 精品色蜜蜜精品视频在线观看| 国产欧美精品日韩| 亚洲精品mp4| 神马久久久久久| 久久久久国产视频| 亚洲欧美色图片| 亚洲成人中文字幕| 日韩在线视频观看| 国产精品久久久久久av福利软件| 亚洲精品狠狠操| 久久精品影视伊人网| 欧美性xxxx18| 97在线看福利| 日韩欧美在线免费| 亚洲欧美成人精品| 久久精品国产久精国产思思| 国产欧美日韩中文字幕| 亚洲国产高清自拍| 欧美日韩一区二区三区在线免费观看| 国产a∨精品一区二区三区不卡| 毛片精品免费在线观看| 超碰日本道色综合久久综合| 国产精品久久久久久久久粉嫩av| 欧美激情欧美激情在线五月| 国产精品久久久久久av福利| 国产91ⅴ在线精品免费观看| 国产精品美女久久久免费| 亚洲一区二区三区视频播放| 最近2019年手机中文字幕| 欧美日韩黄色大片| 国产精品一区二区3区| 亚洲国产精品999| www.国产精品一二区| 国产精品高潮呻吟久久av无限| 97色在线观看免费视频| 日韩欧美999| 亚洲精品自产拍| 亚洲黄页视频免费观看| 色噜噜狠狠色综合网图区| 黑人与娇小精品av专区| 亚洲成人aaa| 国产美女精品视频| 2020久久国产精品| 亚洲午夜女主播在线直播| 亚洲最大福利视频| 91精品在线影院| 亚洲国产精久久久久久久| 最近2019中文字幕第三页视频| 国产97在线|日韩| 亚洲一区二区三区四区视频| 国产精品视频免费观看www| 欧美精品情趣视频| 国产在线视频不卡| 国模视频一区二区三区| yw.139尤物在线精品视频| 中文字幕亚洲欧美日韩2019| 国产精品夫妻激情| 欧美激情手机在线视频| 奇米影视亚洲狠狠色| 欧美一级高清免费播放| 97在线精品视频| 欧日韩不卡在线视频| 亚洲成avwww人| 亚洲成在人线av| 尤物九九久久国产精品的分类| 日韩免费在线播放| 国产亚洲精品久久久久久牛牛| 高清一区二区三区日本久| 亚洲女人天堂成人av在线| 亚洲香蕉伊综合在人在线视看| 国内精品一区二区三区| 亚洲图片欧美日产| 国产大片精品免费永久看nba| 成人欧美在线观看| 日韩久久精品电影| 中文字幕精品一区二区精品| 538国产精品一区二区免费视频| 国产精品久久久久影院日本| 日本成人激情视频| 亚洲精品不卡在线| 亚洲在线观看视频| 日韩视频在线免费| 国产精品日韩av| 国产伊人精品在线| 亚洲欧美日韩国产成人|