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

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

C++ 繼承詳解及實例代碼

2020-05-23 14:00:20
字體:
來源:轉載
供稿:網友

 C++繼承可以是單一繼承或多重繼承,每一個繼承連接可以是public,protected,private也可以是virtual或non-virtual。然后是各個成員函數選項可以是virtual或non-virtual或pure virtual。本文僅僅作出一些關鍵點的驗證。

  public繼承,例如下:

1 class base
2 {...}
3 class derived:public base
4 {...}

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

#include <iostream>#include <stdio.h>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<<s<<std::endl;  derived d("btest",5,"dtest");  std::string ss;  show(ss,d);  std::cout<<ss<<std::endl;  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);編譯器報錯

1 derived_class.cpp: In function `int main(int, char**)':2 derived_class.cpp:84: error: invalid initialization of reference of type 'const derived&' from expression of type 'base'3 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 << dpub.testPublic() << std::endl; }

報下面錯誤,說明testPrivate()不是derived私有函數而是base的私有函數

derived11.cpp:16: error: `std::string base::testPrivate()' is privatederived11.cpp:36: error: within this context

這樣驗證private類型成員無法被繼承(public,private,protected)注:private,protected略去不做證明

下面只要驗證 testProtected 能被第三層繼承類繼承,但是無法被第三層類直接調用就說明是public繼承后繼承類型為protected,而基類為Public類型成員則即可被繼承又可以直接調用。

#include <iostream>#include <string>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 << dpub.testProtected() << std::endl;   deepDerived deepdpub;  std::cout<<deepdpub.testPublic() <<std::endl;  std::cout<<deepdpub.testProtected() <<std::endl;  std::cout<<deepdpub.deepProtected() <<std::endl;  std::cout<<deepdpub.deepPublic() <<std::endl;}

這里服務器報錯

derived12.cpp:13: error: `std::string base::testProtected()' is protectedderived12.cpp:62: error: within this context

這樣就驗證了一個是public,一個是protected,protected是不能直接調用的,但是被繼承后是可以被public成員調用的。
下面的已經證明,詳細步驟就略去如果對該部分驗證感興趣,可以看下面代碼。

#include <iostream>#include <string>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 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<<dpub.testPublic()<<std::endl;    //  //std::cout<<dpub.testProtected()<<std::endl;  //用戶被繼承也是無法使用  //cout<<dpub.testPrivate()<<std::endl;     //基類都是私有函數  std::cout<<dpub.testPubPublic()<<std::endl;  std::cout<<dpub.testProPublic()<<std::endl;  //std::cout<<dpub.testPriPrivate()<<std::endl; //沒有被繼承    deepDerived dd;  std::cout<<dd.test()<<std::endl;      derivedProtected dpro;  //std::cout<<dpro.testPublic()<<std::endl;    //變成protected類型  std::cout<<dpro.testPubProtected()<<std::endl;  std::cout<<dpro.testProProtected()<<std::endl;      deepDerived2 dd2;  std::cout<<dd2.test()<<std::endl;      derivedPrivate dpri;  std::cout<<dpri.testPubPirvate()<<std::endl;  std::cout<<dpri.testProPrivate()<<std::endl;  //  deepDerived3 dd3;//  std::cout<<dd3.test()<<std::endl;}

以上就是對C++ j繼承的資料整理,后續繼續補充相關資料,謝謝大家對本站的支持!


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
最近2019中文字幕第三页视频| 精品视频久久久| 北条麻妃久久精品| 精品女同一区二区三区在线播放| 亚洲精品日韩av| 精品久久久久久久大神国产| 国产在线精品成人一区二区三区| 欧美制服第一页| 日本久久久久久| 中文字幕精品在线| 国产精品96久久久久久| 国产一区二区日韩精品欧美精品| 中文字幕亚洲欧美日韩在线不卡| 91九色综合久久| 欧美性猛交xxxx久久久| 97超碰国产精品女人人人爽| 久久成年人免费电影| 最近2019好看的中文字幕免费| 欧美裸体xxxx极品少妇| 成人激情免费在线| 日韩精品在线第一页| 97**国产露脸精品国产| 91深夜福利视频| 国产日韩欧美日韩| 亚洲欧美一区二区激情| 国产97在线播放| 国产精品久久国产精品99gif| 国产视频精品va久久久久久| 操91在线视频| 国内精品模特av私拍在线观看| 国产成人综合一区二区三区| 欧美一级片免费在线| 国产精品十八以下禁看| 国产伊人精品在线| 亚洲国产日韩欧美在线动漫| 国产午夜精品免费一区二区三区| 欧美日韩国产精品一区二区三区四区| 久久精彩免费视频| 国产亚洲日本欧美韩国| 欧美激情a∨在线视频播放| 国产精品一区二区久久久| 久久久久久免费精品| 亚洲aa中文字幕| 久久久久中文字幕2018| 国产精品免费看久久久香蕉| 亚洲sss综合天堂久久| 欧美激情性做爰免费视频| 91av在线播放视频| 欧美另类第一页| 成人免费淫片视频软件| 欧美一级电影在线| 久久偷看各类女兵18女厕嘘嘘| 亚洲国产天堂久久综合| 国产精品第1页| 国产免费亚洲高清| 高清日韩电视剧大全免费播放在线观看| 欧美猛少妇色xxxxx| 高清日韩电视剧大全免费播放在线观看| 成人在线国产精品| 欧美丝袜一区二区| 最近免费中文字幕视频2019| 欧美性猛交xxxx黑人猛交| 亚洲欧美综合图区| 欧美黑人国产人伦爽爽爽| 亚洲第一精品夜夜躁人人躁| 国产成人a亚洲精品| 欧美一区二区三区艳史| 韩国福利视频一区| 91免费国产视频| 欧美www在线| 欧美激情在线观看视频| 一个色综合导航| 精品夜色国产国偷在线| 国产精品中文字幕久久久| 亚洲自拍偷拍一区| 成人性生交xxxxx网站| 日韩精品www| 亚洲男人天堂视频| 国产精品黄页免费高清在线观看| 97国产一区二区精品久久呦| 久久久久久91香蕉国产| 国产精品video| 亚洲国产精品人人爽夜夜爽| 国产精品无码专区在线观看| 日韩在线资源网| 久久久国产视频91| 亚洲第一国产精品| 日韩在线一区二区三区免费视频| 中文字幕亚洲专区| 亚洲精品wwww| 日韩欧美亚洲范冰冰与中字| 欧美精品久久久久久久免费观看| 日韩一区二区精品视频| 色偷偷亚洲男人天堂| 日韩女优人人人人射在线视频| 亚洲精品成人久久电影| 亚洲欧洲国产一区| 久久久久久国产免费| 欧美与欧洲交xxxx免费观看| 国产精品一区二区久久久久| 国产精品啪视频| 精品国产91久久久久久老师| 日韩欧美在线一区| 久久精品国产欧美亚洲人人爽| 亚洲毛片在线观看| 日韩在线观看网站| 中文字幕精品国产| 国产精品久久久久久久久粉嫩av| 欧美国产欧美亚洲国产日韩mv天天看完整| 欧美电影院免费观看| 欧美黄色片在线观看| 亚洲欧美成人在线| 久久久精品一区| …久久精品99久久香蕉国产| 国产精品视频一区二区三区四| 国模精品一区二区三区色天香| 国产日韩精品在线| 日韩欧美a级成人黄色| 欧美一级黑人aaaaaaa做受| 九九久久久久久久久激情| 欧美激情视频在线免费观看 欧美视频免费一| 欧美情侣性视频| 亚洲国产精品久久精品怡红院| 大桥未久av一区二区三区| 日韩av大片在线| 亚洲国产成人av在线| 日韩精品中文字幕在线| 一区二区三区日韩在线| 久久久精品亚洲| 国模私拍视频一区| 亚洲影院色在线观看免费| 久久久久国产精品www| 欧美激情精品久久久久久变态| 中文字幕av一区| 一夜七次郎国产精品亚洲| 久久伊人色综合| 992tv成人免费视频| 亚洲欧洲在线免费| 国产一区二区日韩精品欧美精品| 亚洲精选中文字幕| 日韩中文字幕视频在线| 911国产网站尤物在线观看| 91av中文字幕| 最近中文字幕mv在线一区二区三区四区| 91av在线看| 久久精品电影网| 国产精品久久久久久久久久| 国产成人亚洲综合91精品| 欧美疯狂性受xxxxx另类| 精品久久久久久久久久久久久久| 亚洲电影免费观看高清完整版在线| 亚洲欧洲中文天堂| 国产午夜精品麻豆| 777777777亚洲妇女| 57pao国产成人免费| 亚洲护士老师的毛茸茸最新章节| 欧美一级高清免费播放| 欧美高清在线观看| 日韩精品在线播放| 国产91色在线|| 久久精品国产成人精品| 91av视频在线观看| 国内精品久久久久久| 国产亚洲精品成人av久久ww|