C++ 继承及实现(一)

2014-11-24 03:04:43 · 作者: · 浏览: 2

如果想透彻了解C++基础,可看微学院的C++入门教程

http://see.xidian.edu.cn/cpp/biancheng/view/91.html

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

private(私有)和protected(保护)都能实现类的封装性。private能够对外部和子类保密,即除了成员所在的类本身可以访问之外,别的都不能直接访问。protected能够对外部保密,但允许子类直接访问这些成员。public、private和protected对成员数据或成员函数的保护程度可以用下表来描述:

\

  public继承,例如下:

1 class base
2 {...}
3 class derived:public base
4 {...}
  如果这样写,编译器会理解成类型为derived的对象同时也是类型为base的对象,但类型为base的对象不是类型为derived的对象。这点很重要。那么函数形参为base类型适用于derived,形参为derived不适用于base。下面是验证代码,一个参数为base的函数,传入derived应该成功执行,相反,一个参数为derived的函数 复制代码
 1 #include 
  
   
 2 #include 
   
     3 4 class base 5 { 6 public: 7 base() 8 :baseName(""),baseData(0) 9 {} 10 11 base(std::string bn,int bd) 12 :baseName(bn),baseData(bd) 13 {} 14 15 std::string getBaseName() const 16 { 17 return baseName; 18 } 19 20 int getBaseData()const 21 { 22 return baseData; 23 } 24 25 private: 26 std::string baseName; 27 int baseData; 28 }; 29 30 class derived:public base 31 { 32 public: 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() const 39 { 40 return derivedName; 41 } 42 private: 43 std::string derivedName; 44 }; 45 46 void show(std::string& info,const base& b) 47 { 48 info.append("Name is "); 49 info.append(b.getBaseName()); 50 info.append(", baseData is "); 51 char buffer[10]; 52 sprintf(buffer,"%d",b.getBaseData()); 53 info.append(buffer); 54 } 55 56 int main(int argc,char* argv[]) 57 { 58 base b("test",10); 59 std::string s; 60 show(s,b); 61 std::cout<
     
     复制代码 
     

运行结果为:

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的成员在继承类里类型为表格里内容

复制代码
 1 class base
 2 {
 3     public:
 4         std::string testPublic()
 5         {
 6             return std::string("this is public base");
 7         }
 8     protected:
 9         std::string testProtected()
10         {
11             return std::string("this is protected base");
12         }
13     private:
14         std::string testPrivate()
15         {
16             return std::string("this is private base");
17         }
18 };
19 
20 class derivedPublic:public base
21 {
22     public:
23         std::string testPubPublic()
24         {
25             return testPublic()+= "in derived";
26         }
27         
28         std::string testProPublic()
29         {    
30             return testProtected()+= "in derived";
31         }
32         
33         std::string testPriPublic()                   
34         {    
35             return testPrivate()+= "in derived";
36         }
37 };
38 
39 int main(int argc,char* argv[])
40 {
41     derivedPublic dpub;
42     std::cout << dpub.testPublic() << std::endl; 
43 }
复制代码

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

derived11.cpp:16: e