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

C++繼承介紹

 更新時(shí)間:2013年01月02日 17:35:04   作者:  
C++繼承可以是單一繼承或多重繼承,每一個(gè)繼承連接可以是public,protected,private也可以是virtual或non-virtual

然后是各個(gè)成員函數(shù)選項(xiàng)可以是virtual或non-virtual或pure virtual。本文僅僅作出一些關(guān)鍵點(diǎn)的驗(yàn)證。

  public繼承,例如下:

復(fù)制代碼 代碼如下:

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

如果這樣寫,編譯器會(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ù)
復(fù)制代碼 代碼如下:

 #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

復(fù)制代碼 代碼如下:

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ò)
復(fù)制代碼 代碼如下:

 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&)'第二點(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)容

復(fù)制代碼 代碼如下:

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)用。
復(fù)制代碼 代碼如下:

 #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)證感興趣,可以看下面代碼。

復(fù)制代碼 代碼如下:

 #include <iostream>
 2 #include <string>
 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<<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;

相關(guān)文章

  • C語言切割多層字符串(strtok_r strtok使用方法)

    C語言切割多層字符串(strtok_r strtok使用方法)

    這篇文章主要介紹了C語言切割多層字符串的方法,說了strtok的弱點(diǎn),使用strtok_r的方法
    2013-11-11
  • C++實(shí)現(xiàn)插入排序?qū)φ麛?shù)數(shù)組排序

    C++實(shí)現(xiàn)插入排序?qū)φ麛?shù)數(shù)組排序

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)插入排序?qū)φ麛?shù)數(shù)組排序,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-05-05
  • QT實(shí)現(xiàn)五子棋游戲

    QT實(shí)現(xiàn)五子棋游戲

    這篇文章主要為大家詳細(xì)介紹了QT實(shí)現(xiàn)五子棋游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-08-08
  • C語言編程中從密碼文件獲取數(shù)據(jù)的函數(shù)總結(jié)

    C語言編程中從密碼文件獲取數(shù)據(jù)的函數(shù)總結(jié)

    這篇文章主要介紹了C語言編程中從密碼文件獲取數(shù)據(jù)的函數(shù)總結(jié),包括getpw()函數(shù)和getpwnam()函數(shù)以及getpwuid()函數(shù),需要的朋友可以參考下
    2015-08-08
  • C語言常用占位符的使用小結(jié)

    C語言常用占位符的使用小結(jié)

    占位符是一種用于格式化輸出的特殊字符,通常用于 printf() 等輸出函數(shù)中,本文主要介紹了C語言常用占位符的使用小結(jié),非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2023-05-05
  • C++?Opencv實(shí)現(xiàn)錄制九宮格視頻

    C++?Opencv實(shí)現(xiàn)錄制九宮格視頻

    這篇文章主要為大家介紹了如何利用C++和OpenCV庫實(shí)現(xiàn)錄制九宮格視頻,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)OpenCV有一定幫助,感興趣的可以了解一下
    2022-05-05
  • OpenCV相機(jī)標(biāo)定的全過程記錄

    OpenCV相機(jī)標(biāo)定的全過程記錄

    這篇文章主要給大家介紹了關(guān)于OpenCV相機(jī)標(biāo)定的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2022-03-03
  • C++實(shí)現(xiàn)LeetCode(77.Combinations 組合項(xiàng))

    C++實(shí)現(xiàn)LeetCode(77.Combinations 組合項(xiàng))

    這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(Combinations 組合項(xiàng)),本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • c++用指針交換數(shù)組的實(shí)例講解

    c++用指針交換數(shù)組的實(shí)例講解

    下面小編就為大家分享一篇c++用指針交換數(shù)組的實(shí)例講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2017-11-11
  • 詳解C++ string常用截取字符串方法

    詳解C++ string常用截取字符串方法

    這篇文章主要介紹了C++ string常用截取字符串方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-05-05

最新評(píng)論

兴文县| 涡阳县| 呼伦贝尔市| 砀山县| 德兴市| 朔州市| 靖宇县| 乐东| 黑山县| 成安县| 桂平市| 富川| 四会市| 瑞丽市| 南阳市| 石首市| 陇西县| 邵东县| 任丘市| 巩义市| 正宁县| 汉川市| 大关县| 荃湾区| 张家口市| 文化| 霍林郭勒市| 钦州市| 湖州市| 即墨市| 巴林左旗| 会同县| 竹山县| 错那县| 栾城县| 鄂伦春自治旗| 闽清县| 柳林县| 定边县| 遂川县| 靖远县|