类别继承-程序代码再用

c++继承机制:

代码

#include<iostream>
using namespace std;
class Base
{
   private:
   int pri_att;
   void pri_show()
   {
     cout<<"Base ::pri_show() is called!"<< endl;
    }
   protected:
   int pro_stt;
   void pro_show()
   {
   cout<<"Base::pro_show() is called!"<<endl;
   }
   public:
    Base()
   :pri_att(1);pro_att(2);pub_att(3){}
   int pub_att;
  void pub_show()
  {
   cout<<"Base::pub_show() is called !"<<endl;
  }
}

class Derived:public Base //定义A_Derived以public继承Base,
{  public: //
  void call_fun() //
  void show() //

}; //

Base类别的成员 Base类别的存取权限 Derived类别public继承后存取权限的等级
pub_att public public
pro_att protected protected
pri_att private 隐藏
pub_show public public
pro_show protected protect
pri_show ptivate 隐藏

 

 

void Derived::call_fun() //
{
cout<<endl;
cout<<"Derived ::call_fun is called"<<endl;
pub_show();
pro_show();

//pri_show();
}
void Deeived::show()
{
cout<<endl;
cout<<"Derived ::show() is called!"<<endl;
cout<<"Base::pub_att="<<pub_att<<endl;
cout<<"Base::pro_att="<<pro_att<<endl;
//cout<<"Base::pri_att="<<pri_att<<endl;
}

int main()
{
  Derived A_Derived;
  cout<<"Accessing Derived's data members"
     <<"inherited form Base..."<<endl;
  cout<<"Derived::pub_att="<<A_Derived.pub_att<<endl;
 
//cout<<"Derived::pro_att="<<A_Derived.pro_att<<endl;
  cout<<endl;
  cout<<"Call Derived's members funcitons"<<"inherited form Base.."<<endl;
  A_Derived.pub_show();
 
//A_Derived.pro_show();
  //A_Derived.pri_show();

  A_Derived.call_show();
  A_Derived.show();
return 0;
}

[root@localhost code]# g++ public_inh.cpp
public_inh.cpp:19: function body for constructor missing
public_inh.cpp:19: invalid data member initialization
public_inh.cpp:19: (use `=' to initialize static data members)
public_inh.cpp:19: ISO C++ forbids declaration of `pro_att' with no type
public_inh.cpp:19: ISO C++ forbids declaration of `pub_att' with no type
public_inh.cpp:19: syntax error before `{' token
public_inh.cpp:19: missing ';' before right brace
public_inh.cpp:20: semicolon missing after declaration of `Base'
public_inh.cpp: In constructor `Base::Base()':
public_inh.cpp:19: parse error before `int'
public_inh.cpp: At global scope:
public_inh.cpp:20: extraneous `int' ignored
public_inh.cpp:20: conflicting types for `Base pub_att'
public_inh.cpp:19: previous declaration as `int pub_att'
public_inh.cpp:25: parse error before `}' token
public_inh.cpp:29: parse error before `void'
public_inh.cpp:30: missing ';' before right brace
public_inh.cpp:38: syntax error before `::' token
public_inh.cpp:41: syntax error before `<<' token
public_inh.cpp:42: syntax error before `<<' token
public_inh.cpp:43: syntax error before `<<' token
public_inh.cpp:44: syntax error before `<<' token
public_inh.cpp: In function `int main()':
public_inh.cpp:53: `class Derived' has no member named `pub_att'
public_inh.cpp:58: no matching function for call to `Derived::pub_show()'
public_inh.cpp:14: `void Base::pro_show()' is protected
public_inh.cpp:59: within this context
public_inh.cpp:8: `void Base::pri_show()' is private
public_inh.cpp:60: within this context
public_inh.cpp:61: no matching function for call to `Derived::call_show()'
public_inh.cpp:62: no matching function for call to `Derived::show()'

根据以上报错,

一一分析排查:

:pri_att(1),pro_att(2),pub_att(3){}

主要还是大部分在细节上,非技术性错误.

经过修改在编译:

public_inh.cpp: In constructor `Base::Base()':
public_inh.cpp:19: class `Base' does not have any field named `pro_att'
public_inh.cpp: In member function `void Derived::show()':
public_inh.cpp:43: `pro_att' undeclared (first use this function)
public_inh.cpp:43: (Each undeclared identifier is reported only once for each
   function it appears in.)
public_inh.cpp:6: `int Base::pri_att' is private
public_inh.cpp:44: within this context
public_inh.cpp: In function `int main()':
public_inh.cpp:54: `class Derived' has no member named `pro_att'
public_inh.cpp:14: `void Base::pro_show()' is protected
public_inh.cpp:59: within this context
public_inh.cpp:8: `void Base::pri_show()' is private
public_inh.cpp:60: within this context
public_inh.cpp:61: no matching function for call to `Derived::call_show()'

再修改,编译:

[root@localhost code]#  g++ public_inh.cpp
public_inh.cpp: In member function `void Derived::show()':
public_inh.cpp:6: `int Base::pri_att' is private
public_inh.cpp:44: within this context
public_inh.cpp: In function `int main()':
public_inh.cpp:12: `int Base::pro_att' is protected
public_inh.cpp:54: within this context
public_inh.cpp:14: `void Base::pro_show()' is protected
public_inh.cpp:59: within this context
public_inh.cpp:8: `void Base::pri_show()' is private
public_inh.cpp:60: within this context

这就很好证实了在public继承中pri_att的不可见性

再次编译

出错情况:

[root@localhost code]# g++ public_inh.cpp
public_inh.cpp: In function `int main()':
public_inh.cpp:12: `int Base::pro_att' is protected
public_inh.cpp:54: within this context

 

[root@localhost code]# g++ public_inh.cpp
[root@localhost code]# g++ -o public_inh.cpp public_inh.out
g++: public_inh.out: No such file or directory
g++: no input files

但是:

[root@localhost code]# g++  public_inh.cpp -o public_inh.out 成功编译
[root@localhost code]#

结果如下:

[root@localhost code]# g++  public_inh.cpp -o public_inh.out
[root@localhost code]# ./public_inh.out
Accessing Derived's data membersinherited form Base...
Derived::pub_att=3
Call Derived's members funcitonsinherited form Base..
Base::pub_show() is called !
Derived ::call_fun is called
Base::pub_show() is called !
Base::pro_show() is called!
Derived ::show() is called!
Base::pub_att=3
Base::pro_att=2

本程序测试的特点:

Base 类别成员 Base类别存取权限的等级 Derive类别public继承后存取权限的等级 在类别的外程序可否通过Derived类别的对象存取
pub_att      
pro_att      
pri_att      
pub_show      
pro_show      
       

 

 

代码:

#include<iostream>
#include<cstring>
using namespace std;
class library_object
{
  protected:
    char name[30];
    long index;
  public:
    void set_data(const char *i_name)
     {
       strcpy(name,i_name);
       index =1;
      }
};
class Book :public library_object
{
  private:
  bool on_shelf;
  public :
  void show_data()
{
  cout<<"name:"<<name;

  cout<<"index:"<<index;
  if(on_shelf==true)
     cout<<"on shelf"<<endl;
  else
     cout<<"not on shelf "<<endl;
}
};
class Reader :public library_object
{
  public :
   void show_data()
    {
     cout<<"name:"<<name;
     cout<<"index:"<<index<<endl;
    }
};
int main()
{
  Reader A_Reader ;
  Book  A_Book;
  A_Reader.set_data("Jorn");
  A_Reader.show_data();
  A_Book.set_data("the C++ Bible");

A_Book.show-data();
return 0;
}

[root@localhost code]# g++ inheritance.cpp
inheritance.cpp: In function `int main()':
inheritance.cpp:47: `class Book' has no member named `show'
inheritance.cpp:47: `data' undeclared (first use this function)
inheritance.cpp:47: (Each undeclared identifier is reported only once for each
   function it appears in.)

 

显然是一个小错:

[root@localhost code]# g++ inheritance.cpp -o inheritance.out
[root@localhost code]# ./inheritance.out
name:Jornindex:1
name:the C++ Bibleindex:1not on shelf
[root@localhost code]#

程序分析:

 

 

 

 

 

 

 

 

 

pravite继承代码;

#include<iostream>
using namespace std;
class Base
{
  private: int pri_att;
           void pri_show()
           { cout<<"Base::pri_show() is called!"<<endl;}
  protected: int pro_att;
              void pro_show()
           { cout<<"Base::pro_show() is called!"<<endl;}
   public : int pub_att;
              void pub_show()
           { cout<<"Base::pub_show() is called!"<<endl;}
           Base()
           :pri_att=1;pro_att=1;pub-att=3;
}
class Derived:private Base
{
public :
   void call_fun();
   void show();
};
void Derived ::call_fun()

{
cout<<endl;
cout<<endl;
cout<<endl;
cout<<endl;
cout<<"Derived ::call_fun is called!"<<endl;
pub_show();
pro_show();
// pri_show();
}
void Derived::show()
{
  cout<<endl;
cout<<"Derived ::show() is called "<<endl;
  cout<<Derived.pubshow<<endl;
  cout<<Derived.proshow<<endl;
  cout<<"Base::pub_att="<<pub_att<<endl;
  cout<<"Base::pro_att="<<pro_att<<endl;
//  cout<<"Base::pri_att="<<pro_att<<endl;
}
int main()
{
return 0;

出错如下:

[root@localhost code]# g++ private_inh.cpp
private_inh.cpp:15: function body for constructor missing
private_inh.cpp:15: ISO C++ forbids declaration of `pro_att' with no type
private_inh.cpp:15: ISO C++ forbids initialization of member `pro_att'
private_inh.cpp:15: making `pro_att' static
private_inh.cpp:15: ISO C++ forbids in-class initialization of non-const static
   member `pro_att'
private_inh.cpp:15: declaration of `int Base::pro_att'
private_inh.cpp:8: conflicts with previous declaration `int Base::pro_att'
private_inh.cpp:15: syntax error before `-' token
private_inh.cpp:15: duplicate member `Base::pro_att'
private_inh.cpp:17: semicolon missing after declaration of `Base'
private_inh.cpp: In constructor `Base::Base()':
private_inh.cpp:15: parse error before `:' token
private_inh.cpp: At global scope:
private_inh.cpp:22: multiple types in one declaration
private_inh.cpp: In member function `void Derived::show()':
private_inh.cpp:38: parse error before `.' token
private_inh.cpp:39: parse error before `.' token
private_inh.cpp: At global scope:
private_inh.cpp:50: parse error before `}' token

修改之后;

[root@localhost code]# g++ private_inh.cpp
private_inh.cpp:17: semicolon missing after declaration of `Base'
private_inh.cpp:22: multiple types in one declaration
private_inh.cpp: In member function `void Derived::show()':
private_inh.cpp:38: parse error before `.' token
private_inh.cpp:39: parse error before `.' token

 

编译出错:

: `Second_Derived Second_Derived::call_fun()' and `void
   Second_Derived::call_fun()' cannot be overloaded
private_inh.cpp:53: semicolon missing after declaration of `class
   Second_Derived'
private_inh.cpp: In member function `void Second_Derived::show()':
private_inh.cpp:69: parse error before `{' token
private_inh.cpp:74: `A_Dervied' undeclared (first use this function)
private_inh.cpp:74: (Each undeclared identifier is reported only once for each
   function it appears in.)
private_inh.cpp:81: `A_Derived' undeclared (first use this function)
private_inh.cpp:87: return-statement with a value, in function declared with a
   void return type
[root@localhost code]#

posted @ 2009-04-30 00:51  fleetwgx  阅读(703)  评论(0编辑  收藏  举报