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

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

 更新時(shí)間:2016年09月15日 14:57:49   作者:清風(fēng)飄過  
這篇文章主要介紹了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 {...}

  如果這樣寫,編譯器會(huì)理解成類型為derived的對(duì)象同時(shí)也是類型為base的對(duì)象,但類型為base的對(duì)象不是類型為derived的對(duì)象。這點(diǎn)很重要。那么函數(shù)形參為base類型適用于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)證,首先給出表格

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

這里解釋一下,這里僅僅表達(dá)基類的成員,被public,protected,private三種方式繼承后,在原基類為public,protectedc,private的成員在繼承類里類型為表格里內(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ò)誤,說明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類型成員無法被繼承(public,private,protected)注:private,protected略去不做證明

下面只要驗(yàn)證 testProtected 能被第三層繼承類繼承,但是無法被第三層類直接調(diào)用就說明是public繼承后繼承類型為protected,而基類為Public類型成員則即可被繼承又可以直接調(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()          //私有成員并沒有被繼承下來
//    {  
//      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;     //基類都是私有函數(shù)
  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;
}

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

相關(guān)文章

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

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

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

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

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

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

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

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

    這篇文章主要介紹了C語言中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寫一個(gè)web服務(wù)器之I/O多路復(fù)用

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

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

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

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

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

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

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

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

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

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

最新評(píng)論

康定县| 丰台区| 罗平县| 永仁县| 温州市| 文登市| 津市市| 泰宁县| 轮台县| 沙雅县| 桂平市| 桐柏县| 前郭尔| 东乡| 台东市| 乐都县| 永德县| 延津县| 日土县| 上饶市| 永宁县| 海盐县| 胶南市| 太仆寺旗| 松原市| 伊春市| 光泽县| 忻城县| 韩城市| 承德市| 乐东| 平湖市| 宽甸| 东丰县| 霍山县| 许昌市| 蒙城县| 怀远县| 基隆市| 五台县| 麟游县|