设为首页 加入收藏

TOP

C++继承
2012-12-02 22:44:56 来源: 作者: 【 】 浏览:303
Tags:继承

  C++(www.cppentry.com)继承可以是单一继承或多重继承,每一个继承连接可以是public,protected,private也可以是virtual或non-virtual。然后是各个成员函数选项可以是virtual或non-virtual或pure virtual。本文仅仅作出一些关键点的验证。

  public继承,例如下:

1classbase2{...}3class derived:publicbase4 {...}
  如果这样写,编译器会理解成类型为derived的对象同时也是类型为base的对象,但类型为base的对象不是类型为derived的对象。这点很重要。那么函数形参为base类型适用于derived,形参为derived不适用于base。下面是验证代码,一个参数为base的函数,传入derived应该成功执行,相反,一个参数为derived的函数
 1 #include <iostream> 2 #include <stdio.h> 3 4classbase 5{ 6public: 7base() 8     :baseName(""),baseData(0) 9    {}1011base(std::string bn,int bd)12    :baseName(bn),baseData(bd)13    {}1415     std::string getBaseName() const16    {17return baseName;18    }1920int getBaseData()const21    {22return baseData;23    }2425private:26         std::string baseName;27int baseData;28};2930class derived:publicbase31{32public:33         derived():base(),derivedName("")34        {}35         derived(std::string bn,int bd,std::string dn)36         :base(bn,bd),derivedName(dn)37        {}38         std::string getDerivedName() const39        {40return derivedName;41        }42private:43         std::string derivedName;44};4546void show(std::string& info,constbase& b)47{48     info.append("Name is ");49    info.append(b.getBaseName());50     info.append(", baseData is ");51char buffer[10];52     sprintf(buffer,"%d",b.getBaseData());53        info.append(buffer);54}5556int main(int argc,char* argv[])57{58base b("test",10);59     std::string s;60    show(s,b);61     std::cout<<s<<std::endl;62     derived d("btest",5,"dtest");63     std::string ss;64    show(ss,d);65     std::cout<<ss<<std::endl;66return0;67 }

运行结果为:

base:baseName is test, baseData is10base:baseName is btest, baseData is5

下面改改代码,将函数参数变为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&)'

第二点对各种形式的继承作出验证,首先给出表格

继承方式\成员类型publicprotectedprivate
publicpublicprotected无法继承
protectedprotectedprotected无法继承
privateprivateprivate无法继承

这里解释一下,这里仅仅表达基类的成员,被public,protected,private三种方式继承后,在原基类为public,protectedc,private的成员在继承类里类型为表格里内容

 1classbase 2{ 3public: 4         std::string testPublic() 5        { 6return std::string("this is public base"); 7        } 8protected: 9         std::string testProtected()10        {11return std::string("this is protected base");12        }13private:14         std::string testPrivate()15        {16return std::string("this is private base");17        }18};1920class derivedPublic:publicbase21{22public:23         std::string testPubPublic()24        {25return testPublic()+= "in derived";26        }2728         std::string testProPublic()29        {    30return testProtected()+= "in derived";31        }3233         std::string testPriPublic()                   34        {    35return testPrivate()+= "in derived";36        }37};3839int main(int argc,char* argv[])4041    derivedPublic dpub;42     std::cout << dpub.testPublic() << std::endl; 43

报下面错误,说明testPrivate()不是derived私有函数而是base的私有函数

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

这样验证private类型成员无法被继承(public,private,protected)注:private,protected略去不做证明

下面只要验证 testProtected 能被第三层继承类继承,但是无法被第三层类直接调用就说明是public继承后继承类型为protected,而基类为Public类型成员则即可被继承又可以直接调用。

 1 #include <iostream> 2 #include <string> 3 4classbase 5{ 6public: 7         std::string testPublic() 8        { 9return std::string("this is public base");10        }11protected:12         std::string testProtected()13        {14return std::string("this is protected base");15        }16private:17         std::string testPrivate()18        {19return std::string("this is private base");20        }21};2223class derivedPublic:publicbase24{25public:26         std::string testPubPublic()27        {28return testPublic()+= "in derived";29        }3031         std::string testProPublic()32        {    33return testProtected()+= "in derived";34        }3536//        std::string testPriPublic()                   37//        {    38//            return testPrivate()+= "in derived";39//        }40};4142class deepDerived:public derivedPublic43{44public:45         std::string deepProtected()46        {47return testProtected() +="in deep";48        }4950         std::string deepPublic()51        {52return testPublic() +="indeep";53        }54};5556int main(int argc,char* argv[])57{58    derivedPublic dpub;59     std::cout << dpub.testProtected() << std::endl; 60    deepDerived deepdpub;61     std::cout<<deepdpub.testPublic() <<std::endl;62     std::cout<<deepdpub.testProtected() <<std::endl;63     std::cout<<deepdpub.deepProtected() <<std::endl;64     std::cout<<deepdpub.deepPublic() <<std::endl;65 }

这里服务器报错

derived12.cpp:13: error: `std::stringbase::testProtected()' is protectedderived12.cpp:62: error: within this context
这样就验证了一个是public,一个是protected,protected是不能直接调用的,但是被继承后是可以被public成员调用的。
下面的已经证明,详细步骤就略去如果对该部分验证感兴趣,可以看下面代码。
View Code
  1 #include <iostream>  2 #include <string>  3classbase  4{  5public:  6         std::string testPublic()  7        {  8return std::string("this is public base");  9        } 10protected: 11         std::string testProtected() 12        { 13return std::string("this is protected base"); 14        } 15private: 16         std::string testPrivate() 17        { 18return std::string("this is private base"); 19        } 20}; 21 22class derivedPublic:publicbase 23{ 24public: 25         std::string testPubPublic() 26        { 27return testPublic()+= "in derived"; 28        } 29 30         std::string testProPublic() 31        {     32return testProtected()+= "in derived"; 33        } 34 35//        std::string testPriPublic()                   //私有成员并没有被继承下来 36//        {     37//            return testPrivate()+= "in derived"; 38//        } 39}; 40 41class deepDerived:public derivedPublic 42{ 43public: 44         std::string test() 45        { 46return testPublic() +="in 3"; 47        } 48}; 49 50class derivedProtected:protectedbase 51{ 52public: 53         std::string testPubProtected() 54        { 55return testPublic()+= "in derived"; 56        } 57 58         std::string testProProtected() 59        {     60return testProtected()+= "in derived"; 61        } 62}; 63 64class deepDerived2:public derivedProtected 65{ 66public: 67         std::string test() 68        { 69return testPublic() +="in 3"; 70        } 71}; 72 73class derivedPrivate:privatebase 74{ 75public: 76         std::string testPubPirvate() 77        { 78return testPublic()+= "in derived"; 79        } 80 81         std::string testProPrivate() 82        {     83return testProtected()+= "in derived"; 84        } 85 86}; 87 88//class deepDerived3:public derivedPrivate 89//{ 90//    public: 91//        std::string test() 92//        { 93//            return testPublic() +="in 3"; 94//        } 95//}; 96 97int main(int argc,char* argv[]) 98{ 99    derivedPublic dpub;100//derivedProtected dpro;101//derivedPrivate dpri;102     std::cout<<dpub.testPublic()<<std::endl;       //103//std::cout<<dpub.testProtected()<<std::endl;    //用户被继承也是无法使用104//cout<<dpub.testPrivate()<<std::endl;         //基类都是私有函数105     std::cout<<dpub.testPubPublic()<<std::endl;106     std::cout<<dpub.testProPublic()<<std::endl;107//std::cout<<dpub.testPriPrivate()<<std::endl; //没有被继承108109    deepDerived dd;110     std::cout<<dd.test()<<std::endl;111112    derivedProtected dpro;113//std::cout<<dpro.testPublic()<<std::endl;        //变成protected类型114     std::cout<<dpro.testPubProtected()<<std::endl;115     std::cout<<dpro.testProProtected()<<std::endl;116117    deepDerived2 dd2;118     std::cout<<dd2.test()<<std::endl;119120    derivedPrivate dpri;121     std::cout<<dpri.testPubPirvate()<<std::endl;122     std::cout<<dpri.testProPrivate()<<std::endl;123124//    deepDerived3 dd3;125//    std::cout<<dd3.test()<<std::endl;126

 

 

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇异步操作(三) 下一篇C++文件依存关系

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: