c++继承机制:
代码
#include
using namespace std;
class Base
{
private:
int pri_att;
void pri_show()
{
cout<<"Base ::pri_show() is called!"<
protected:
int pro_stt;
void pro_show()
{
cout<<"Base::pro_show() is called!"<
public:
Base()
:pri_att(1);pro_att(2);pub_att(3){}
int pub_att;
void pub_show()
{
cout<<"Base::pub_show() is called !"<
}
class Derived:public Base &#xff0f;&#xff0f;定义&#xff21;&#xff3f;&#xff24;&#xff45;&#xff52;&#xff49;&#xff56;&#xff45;&#xff44;以&#xff50;&#xff55;&#xff42;&#xff4c;&#xff49;&#xff43;继承&#xff22;&#xff41;&#xff53;&#xff45;&#xff0c;
{ public: &#xff0f;&#xff0f;
void call_fun() &#xff0f;&#xff0f;
void show() &#xff0f;&#xff0f;
}; &#xff0f;&#xff0f;
&#xff22;&#xff41;&#xff53;&#xff45;类别的成员 | &#xff22;&#xff41;&#xff53;&#xff45;类别的存取权限 | &#xff24;&#xff45;&#xff52;&#xff49;&#xff56;&#xff45;&#xff44;类别&#xff50;&#xff55;&#xff42;&#xff4c;&#xff49;&#xff43;继承后存取权限的等级 |
&#xff50;&#xff55;&#xff42;&#xff3f;&#xff41;&#xff54;&#xff54; | &#xff50;&#xff55;&#xff42;&#xff4c;&#xff49;&#xff43; | &#xff50;&#xff55;&#xff42;&#xff4c;&#xff49;&#xff43; |
&#xff50;&#xff52;&#xff4f;&#xff3f;&#xff41;&#xff54;&#xff54; | &#xff50;&#xff52;&#xff4f;&#xff54;&#xff45;&#xff43;&#xff54;&#xff45;&#xff44; | &#xff50;&#xff52;&#xff4f;&#xff54;&#xff45;&#xff43;&#xff54;&#xff45;&#xff44; |
&#xff50;&#xff52;&#xff49;&#xff3f;&#xff41;&#xff54;&#xff54; | &#xff50;&#xff52;&#xff49;&#xff56;&#xff41;&#xff54;&#xff45; | 隐藏 |
&#xff50;&#xff55;&#xff42;&#xff3f;&#xff53;&#xff48;&#xff4f;&#xff57; | &#xff50;&#xff55;&#xff42;&#xff4c;&#xff49;&#xff43; | &#xff50;&#xff55;&#xff42;&#xff4c;&#xff49;&#xff43; |
&#xff50;&#xff52;&#xff4f;&#xff3f;&#xff53;&#xff48;&#xff4f;&#xff57; | &#xff50;&#xff52;&#xff4f;&#xff54;&#xff45;&#xff43;&#xff54;&#xff45;&#xff44; | &#xff50;&#xff52;&#xff4f;&#xff54;&#xff45;&#xff43;&#xff54; |
&#xff50;&#xff52;&#xff49;&#xff3f;&#xff53;&#xff48;&#xff4f;&#xff57; | &#xff50;&#xff54;&#xff49;&#xff56;&#xff41;&#xff54;&#xff45; | 隐藏 |
void Derived::call_fun() &#xff0f;&#xff0f;
{
cout<
pro_show();
&#xff0f;&#xff0f;&#xff50;&#xff52;&#xff49;&#xff3f;&#xff53;&#xff48;&#xff4f;&#xff57;&#xff08;&#xff09;&#xff1b;
}
void Deeived::show()
{
cout<
}
int main()
{
Derived A_Derived;
cout<<"Accessing Derived&#39;s data members"
<<"inherited form Base..."<
&#xff0f;&#xff0f;A_Derived.pro_show();
&#xff0f;&#xff0f;A_Derived.pri_show();
A_Derived.call_show();
A_Derived.show();
return 0;
}
[root&#64;localhost code]# g&#43;&#43; 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 &#96;&#61;&#39; to initialize static data members)
public_inh.cpp:19: ISO C&#43;&#43; forbids declaration of &#96;pro_att&#39; with no type
public_inh.cpp:19: ISO C&#43;&#43; forbids declaration of &#96;pub_att&#39; with no type
public_inh.cpp:19: syntax error before &#96;{&#39; token
public_inh.cpp:19: missing &#39;;&#39; before right brace
public_inh.cpp:20: semicolon missing after declaration of &#96;Base&#39;
public_inh.cpp: In constructor &#96;Base::Base()&#39;:
public_inh.cpp:19: parse error before &#96;int&#39;
public_inh.cpp: At global scope:
public_inh.cpp:20: extraneous &#96;int&#39; ignored
public_inh.cpp:20: conflicting types for &#96;Base pub_att&#39;
public_inh.cpp:19: previous declaration as &#96;int pub_att&#39;
public_inh.cpp:25: parse error before &#96;}&#39; token
public_inh.cpp:29: parse error before &#96;void&#39;
public_inh.cpp:30: missing &#39;;&#39; before right brace
public_inh.cpp:38: syntax error before &#96;::&#39; token
public_inh.cpp:41: syntax error before &#96;<<&#39; token
public_inh.cpp:42: syntax error before &#96;<<&#39; token
public_inh.cpp:43: syntax error before &#96;<<&#39; token
public_inh.cpp:44: syntax error before &#96;<<&#39; token
public_inh.cpp: In function &#96;int main()&#39;:
public_inh.cpp:53: &#96;class Derived&#39; has no member named &#96;pub_att&#39;
public_inh.cpp:58: no matching function for call to &#96;Derived::pub_show()&#39;
public_inh.cpp:14: &#96;void Base::pro_show()&#39; is protected
public_inh.cpp:59: within this context
public_inh.cpp:8: &#96;void Base::pri_show()&#39; is private
public_inh.cpp:60: within this context
public_inh.cpp:61: no matching function for call to &#96;Derived::call_show()&#39;
public_inh.cpp:62: no matching function for call to &#96;Derived::show()&#39;
根据以上报错&#xff0c;
一一分析排查&#xff1a;
:pri_att(1),pro_att(2),pub_att(3){}
主要还是大部分在细节上&#xff0c;非技术性错误&#xff0e;
经过修改在编译&#xff1a;
public_inh.cpp: In constructor &#96;Base::Base()&#39;:
public_inh.cpp:19: class &#96;Base&#39; does not have any field named &#96;pro_att&#39;
public_inh.cpp: In member function &#96;void Derived::show()&#39;:
public_inh.cpp:43: &#96;pro_att&#39; 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: &#96;int Base::pri_att&#39; is private
public_inh.cpp:44: within this context
public_inh.cpp: In function &#96;int main()&#39;:
public_inh.cpp:54: &#96;class Derived&#39; has no member named &#96;pro_att&#39;
public_inh.cpp:14: &#96;void Base::pro_show()&#39; is protected
public_inh.cpp:59: within this context
public_inh.cpp:8: &#96;void Base::pri_show()&#39; is private
public_inh.cpp:60: within this context
public_inh.cpp:61: no matching function for call to &#96;Derived::call_show()&#39;
再修改&#xff0c;编译&#xff1a;
[root&#64;localhost code]# g&#43;&#43; public_inh.cpp
public_inh.cpp: In member function &#96;void Derived::show()&#39;:
public_inh.cpp:6: &#96;int Base::pri_att&#39; is private
public_inh.cpp:44: within this context
public_inh.cpp: In function &#96;int main()&#39;:
public_inh.cpp:12: &#96;int Base::pro_att&#39; is protected
public_inh.cpp:54: within this context
public_inh.cpp:14: &#96;void Base::pro_show()&#39; is protected
public_inh.cpp:59: within this context
public_inh.cpp:8: &#96;void Base::pri_show()&#39; is private
public_inh.cpp:60: within this context
这就很好证实了在&#xff50;&#xff55;&#xff42;&#xff4c;&#xff49;&#xff43;继承中&#xff50;&#xff52;&#xff49;&#xff3f;&#xff41;&#xff54;&#xff54;的不可见性
再次编译
出错情况&#xff1a;
[root&#64;localhost code]# g&#43;&#43; public_inh.cpp
public_inh.cpp: In function &#96;int main()&#39;:
public_inh.cpp:12: &#96;int Base::pro_att&#39; is protected
public_inh.cpp:54: within this context
[root&#64;localhost code]# g&#43;&#43; public_inh.cpp
[root&#64;localhost code]# g&#43;&#43; -o public_inh.cpp public_inh.out
g&#43;&#43;: public_inh.out: No such file or directory
g&#43;&#43;: no input files
但是&#xff1a;
[root&#64;localhost code]# g&#43;&#43; public_inh.cpp -o public_inh.out 成功编译
[root&#64;localhost code]#
结果如下&#xff1a;
[root&#64;localhost code]# g&#43;&#43; public_inh.cpp -o public_inh.out
[root&#64;localhost code]# ./public_inh.out
Accessing Derived&#39;s data membersinherited form Base...
Derived::pub_att&#61;3
Call Derived&#39;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&#61;3
Base::pro_att&#61;2
本程序测试的特点&#xff1a;
&#xff22;&#xff41;&#xff53;&#xff45; 类别成员 | &#xff22;&#xff41;&#xff53;&#xff45;类别存取权限的等级 | &#xff24;&#xff45;&#xff52;&#xff49;&#xff56;&#xff45;类别&#xff50;&#xff55;&#xff42;&#xff4c;&#xff49;&#xff43;继承后存取权限的等级 | 在类别的外程序可否通过&#xff24;&#xff45;&#xff52;&#xff49;&#xff56;&#xff45;&#xff44;类别的对象存取 |
&#xff50;&#xff55;&#xff42;&#xff3f;&#xff41;&#xff54;&#xff54; | |||
&#xff50;&#xff52;&#xff4f;&#xff3f;&#xff41;&#xff54;&#xff54; | |||
&#xff50;&#xff52;&#xff49;&#xff3f;&#xff41;&#xff54;&#xff54; | |||
&#xff50;&#xff55;&#xff42;&#xff3f;&#xff53;&#xff48;&#xff4f;&#xff57; | |||
&#xff50;&#xff52;&#xff4f;&#xff3f;&#xff53;&#xff48;&#xff4f;&#xff57; | |||
代码&#xff1a;
#include cout<<"index:"< A_Book.show-data(); [root&#64;localhost code]# g&#43;&#43; inheritance.cpp 显然是一个小错&#xff1a; [root&#64;localhost code]# g&#43;&#43; inheritance.cpp -o inheritance.out 程序分析&#xff1a; &#xff50;&#xff52;&#xff41;&#xff56;&#xff49;&#xff54;&#xff45;继承代码&#xff1b; #include { &#xff5d; 出错如下: [root&#64;localhost code]# g&#43;&#43; private_inh.cpp 修改之后; [root&#64;localhost code]# g&#43;&#43; private_inh.cpp 编译出错&#xff1a; : &#96;Second_Derived Second_Derived::call_fun()&#39; and &#96;void
#include
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 &#61;1;
}
};
class Book :public library_object
{
private:
bool on_shelf;
public :
void show_data()
{
cout<<"name:"<
cout<<"on shelf"<
cout<<"not on shelf "<
};
class Reader :public library_object
{
public :
void show_data()
{
cout<<"name:"<
};
int main()
{
Reader A_Reader ;
Book A_Book;
A_Reader.set_data("Jorn");
A_Reader.show_data();
A_Book.set_data("the C&#43;&#43; Bible");
return 0;
}
inheritance.cpp: In function &#96;int main()&#39;:
inheritance.cpp:47: &#96;class Book&#39; has no member named &#96;show&#39;
inheritance.cpp:47: &#96;data&#39; undeclared (first use this function)
inheritance.cpp:47: (Each undeclared identifier is reported only once for each
function it appears in.)
[root&#64;localhost code]# ./inheritance.out
name:Jornindex:1
name:the C&#43;&#43; Bibleindex:1not on shelf
[root&#64;localhost code]#
using namespace std;
class Base
{
private: int pri_att;
void pri_show()
{ cout<<"Base::pri_show() is called!"<
void pro_show()
{ cout<<"Base::pro_show() is called!"<
void pub_show()
{ cout<<"Base::pub_show() is called!"<
:pri_att&#61;1;pro_att&#61;1;pub-att&#61;3;
}
class Derived:private Base
{
public :
void call_fun();
void show();
};
void Derived ::call_fun()
cout<
pro_show();
// pri_show();
}
void Derived::show()
{
cout<
int main()
{
return 0;
private_inh.cpp:15: function body for constructor missing
private_inh.cpp:15: ISO C&#43;&#43; forbids declaration of &#96;pro_att&#39; with no type
private_inh.cpp:15: ISO C&#43;&#43; forbids initialization of member &#96;pro_att&#39;
private_inh.cpp:15: making &#96;pro_att&#39; static
private_inh.cpp:15: ISO C&#43;&#43; forbids in-class initialization of non-const static
member &#96;pro_att&#39;
private_inh.cpp:15: declaration of &#96;int Base::pro_att&#39;
private_inh.cpp:8: conflicts with previous declaration &#96;int Base::pro_att&#39;
private_inh.cpp:15: syntax error before &#96;-&#39; token
private_inh.cpp:15: duplicate member &#96;Base::pro_att&#39;
private_inh.cpp:17: semicolon missing after declaration of &#96;Base&#39;
private_inh.cpp: In constructor &#96;Base::Base()&#39;:
private_inh.cpp:15: parse error before &#96;:&#39; token
private_inh.cpp: At global scope:
private_inh.cpp:22: multiple types in one declaration
private_inh.cpp: In member function &#96;void Derived::show()&#39;:
private_inh.cpp:38: parse error before &#96;.&#39; token
private_inh.cpp:39: parse error before &#96;.&#39; token
private_inh.cpp: At global scope:
private_inh.cpp:50: parse error before &#96;}&#39; token
private_inh.cpp:17: semicolon missing after declaration of &#96;Base&#39;
private_inh.cpp:22: multiple types in one declaration
private_inh.cpp: In member function &#96;void Derived::show()&#39;:
private_inh.cpp:38: parse error before &#96;.&#39; token
private_inh.cpp:39: parse error before &#96;.&#39; token
Second_Derived::call_fun()&#39; cannot be overloaded
private_inh.cpp:53: semicolon missing after declaration of &#96;class
Second_Derived&#39;
private_inh.cpp: In member function &#96;void Second_Derived::show()&#39;:
private_inh.cpp:69: parse error before &#96;{&#39; token
private_inh.cpp:74: &#96;A_Dervied&#39; 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: &#96;A_Derived&#39; undeclared (first use this function)
private_inh.cpp:87: return-statement with a value, in function declared with a
void return type
[root&#64;localhost code]#