最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++ 繼承詳解及實(shí)例代碼

 更新時(shí)間:2016年09月15日 14:57:49   作者:清風(fēng)飄過(guò)  
這篇文章主要介紹了C++ 繼承詳解,這里整理了詳細(xì)的資料及實(shí)例代碼,有需要的小伙伴可以參考下

 C++繼承可以是單一繼承或多重繼承,每一個(gè)繼承連接可以是public,protected,private也可以是virtual或non-virtual。然后是各個(gè)成員函數(shù)選項(xiàng)可以是virtual或non-virtual或pure virtual。本文僅僅作出一些關(guān)鍵點(diǎn)的驗(yàn)證。

  public繼承,例如下:

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

  如果這樣寫(xiě),編譯器會(huì)理解成類(lèi)型為derived的對(duì)象同時(shí)也是類(lèi)型為base的對(duì)象,但類(lèi)型為base的對(duì)象不是類(lèi)型為derived的對(duì)象。這點(diǎn)很重要。那么函數(shù)形參為base類(lèi)型適用于derived,形參為derived不適用于base。下面是驗(yàn)證代碼,一個(gè)參數(shù)為base的函數(shù),傳入derived應(yīng)該成功執(zhí)行,相反,一個(gè)參數(shù)為derived的函數(shù)

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

運(yùn)行結(jié)果為:

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

下面改改代碼,將函數(shù)參數(shù)變?yōu)閐erived

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);
}

調(diào)用show(ss,d);編譯器報(bào)錯(cuò)

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&)'

第二點(diǎn)對(duì)各種形式的繼承作出驗(yàn)證,首先給出表格

繼承方式\成員類(lèi)型 public protected private
public public protected 無(wú)法繼承
protected protected protected 無(wú)法繼承
private private private 無(wú)法繼承

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

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

報(bào)下面錯(cuò)誤,說(shuō)明testPrivate()不是derived私有函數(shù)而是base的私有函數(shù)

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

這樣驗(yàn)證private類(lèi)型成員無(wú)法被繼承(public,private,protected)注:private,protected略去不做證明

下面只要驗(yàn)證 testProtected 能被第三層繼承類(lèi)繼承,但是無(wú)法被第三層類(lèi)直接調(diào)用就說(shuō)明是public繼承后繼承類(lèi)型為protected,而基類(lèi)為Public類(lèi)型成員則即可被繼承又可以直接調(diào)用。

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

這里服務(wù)器報(bào)錯(cuò)

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

這樣就驗(yàn)證了一個(gè)是public,一個(gè)是protected,protected是不能直接調(diào)用的,但是被繼承后是可以被public成員調(diào)用的。
下面的已經(jīng)證明,詳細(xì)步驟就略去如果對(duì)該部分驗(yàn)證感興趣,可以看下面代碼。

#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()          //私有成員并沒(méi)有被繼承下來(lái)
//    {  
//      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;  //用戶(hù)被繼承也是無(wú)法使用
  //cout<<dpub.testPrivate()<<std::endl;     //基類(lèi)都是私有函數(shù)
  std::cout<<dpub.testPubPublic()<<std::endl;
  std::cout<<dpub.testProPublic()<<std::endl;
  //std::cout<<dpub.testPriPrivate()<<std::endl; //沒(méi)有被繼承
  
  deepDerived dd;
  std::cout<<dd.test()<<std::endl;
    
  derivedProtected dpro;
  //std::cout<<dpro.testPublic()<<std::endl;    //變成protected類(lèi)型
  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;
}

以上就是對(duì)C++ j繼承的資料整理,后續(xù)繼續(xù)補(bǔ)充相關(guān)資料,謝謝大家對(duì)本站的支持!

相關(guān)文章

  • Matlab繪制有趣的羅盤(pán)時(shí)鐘的示例代碼

    Matlab繪制有趣的羅盤(pán)時(shí)鐘的示例代碼

    這篇文章主要介紹了如何利用Matlab實(shí)現(xiàn)繪制有趣的羅盤(pán)時(shí)鐘,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Matlab有一定的幫助,需要的可以參考一下
    2023-01-01
  • C++利用eigen庫(kù)實(shí)現(xiàn)求歐拉角

    C++利用eigen庫(kù)實(shí)現(xiàn)求歐拉角

    這篇文章主要為大家詳細(xì)介紹了C++如何利用eigen庫(kù)自帶的matrix.eulerAngles()函數(shù)實(shí)現(xiàn)求歐拉角,文中的示例代碼講解詳細(xì),有需要的小伙伴可以參考下
    2023-11-11
  • C++中指針函數(shù)與函數(shù)指針的使用

    C++中指針函數(shù)與函數(shù)指針的使用

    今天小編就為大家分享一篇關(guān)于C++中指針函數(shù)與函數(shù)指針的使用,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2018-12-12
  • C語(yǔ)言中scanf函數(shù)的原樣輸入的坑及解決

    C語(yǔ)言中scanf函數(shù)的原樣輸入的坑及解決

    這篇文章主要介紹了C語(yǔ)言中scanf函數(shù)的原樣輸入的坑及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • C++實(shí)現(xiàn)動(dòng)態(tài)順序表(vector)

    C++實(shí)現(xiàn)動(dòng)態(tài)順序表(vector)

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)動(dòng)態(tài)順序表,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-05-05
  • 如何用C寫(xiě)一個(gè)web服務(wù)器之I/O多路復(fù)用

    如何用C寫(xiě)一個(gè)web服務(wù)器之I/O多路復(fù)用

    本文主要介紹了如何用C寫(xiě)一個(gè)web服務(wù)器之I/O多路復(fù)用,本次選擇了 I/O 模型的優(yōu)化,因?yàn)樗欠?wù)器的基礎(chǔ),這個(gè)先完成的話,后面的優(yōu)化就可以選擇各個(gè)模塊來(lái)進(jìn)行,不必進(jìn)行全局化的改動(dòng)了。
    2021-05-05
  • C語(yǔ)言基礎(chǔ) strlen 函數(shù)

    C語(yǔ)言基礎(chǔ) strlen 函數(shù)

    這篇文章主要介紹了C語(yǔ)言基礎(chǔ) strlen 函數(shù),在C 語(yǔ)言中,char 字符串也是一種非常重要的數(shù)據(jù)類(lèi)型,我們可以使用 strlen 函數(shù)獲取字符串長(zhǎng)度,這就是C語(yǔ)言strlen 函數(shù)的作用,下面我們來(lái)簡(jiǎn)單介紹該內(nèi)容,需要的朋友可以參考以下
    2021-10-10
  • C++自定義數(shù)據(jù)類(lèi)型方法詳情

    C++自定義數(shù)據(jù)類(lèi)型方法詳情

    這篇文章主要介紹了C++自定義數(shù)據(jù)類(lèi)型方法詳情,總結(jié)了兩種方法,分別是typedef聲明和枚舉類(lèi)型enum,相關(guān)內(nèi)容需要的小伙伴可以參考下面文章內(nèi)容,希望對(duì)你的學(xué)習(xí)有所幫助
    2022-03-03
  • c++判斷是否為目錄的示例分享

    c++判斷是否為目錄的示例分享

    這篇文章主要介紹了c++判斷是否為目錄的示例,需要的朋友可以參考下
    2014-03-03
  • 基于C++實(shí)現(xiàn)一個(gè)簡(jiǎn)單的音樂(lè)系統(tǒng)

    基于C++實(shí)現(xiàn)一個(gè)簡(jiǎn)單的音樂(lè)系統(tǒng)

    C++中的Beep 函數(shù)是一個(gè)發(fā)出嗡鳴聲的函數(shù),本文將利用這個(gè)函數(shù)實(shí)現(xiàn)制作一個(gè)簡(jiǎn)單的聲音系統(tǒng)。文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下
    2022-12-12

最新評(píng)論

青海省| 漠河县| 灵寿县| 奈曼旗| 军事| 锦屏县| 济阳县| 洞头县| 维西| 连州市| 平武县| 内乡县| 桐庐县| 昌都县| 鸡西市| 杭锦旗| 宝丰县| 文化| 淳安县| 玛多县| 丹阳市| 阳朔县| 鹰潭市| 四川省| 楚雄市| 哈巴河县| 胶南市| 阳春市| 无极县| 沙河市| 新沂市| 吉林省| 淮南市| 桐乡市| 盖州市| 化德县| 靖州| 长泰县| 扬州市| 沈阳市| 临漳县|