设为首页 加入收藏

TOP

10--C++中的继承
2015-07-20 17:33:32 来源: 作者: 【 】 浏览:3
Tags:10--C 继承

一.继承的概念

*:子类拥有父类的所有的成员变量和成员函数

*: 子类就是一种特殊的父类

*: 子类对象可以当做父类对象使用

*: 子类可以拥有父类没有的方法和属性

注意:(1)C++中class的继承默认为private继承

(2)private继承的子类拥有父类的所有成员

(3)private继承使得父类的所有成员在子类中变成private成员

二.C++中的访问级别与继承

*: public

父类成员在子类中保持原有访问级别

*: private继承

父类成员在子类中变为private成员

*:类的 protected 成员

(1)protected成员可以在子类中被访问,但是不能在外界访问。

(2)protected成员的访问权限介于 public 和 private 之间

class Parent
{
//private: /// 若为私有,编译不通过 
protected:
	int a;
public:
	Parent()
	{
		a = 100;
	}
	void print()
	{
		cout<<"a="<
  
   a =a;
		this->b =b;
	}
};

  

类成员访问级别设置的原则

*: 需要被外界访问的成员直接设置为 public

*: 只能在当前类中访问的成员设置为 private

*: 只能在当前类中和子类中访问的成员设置为 protected

注意: private 成员在子类中依然存在,但是却无法访问到。

即使私有继承:

	Parent p;
	Child c;
	cout<
  
   
\

\

公式: 继承成员对外的访问属性

={继承方式,父类成员访问级别}

三. 赋值兼容性原则<??http://www.2cto.com/kf/ware/vc/" target="_blank" class="keylink">vc3Ryb25nPjwvaDE+CjxwPjxzdHJvbmc+ICAgICqjuiAg19PA4LbUz/O/ydLUtbHX9ri4wOC21M/zyrnTwzwvc3Ryb25nPjwvcD4KPHA+PHN0cm9uZz4gICAgKqO6ICDX08DgttTP87/J0tTWsb3TuLMmIzIwNTQwO7j4uLjA4LbUz/M8L3N0cm9uZz48L3A+CjxwPjxzdHJvbmc+ICAgICqjuiAg19PA4LbUz/O/ydLU1rG907P1yry7r7i4wOC21M/zPC9zdHJvbmc+PC9wPgo8cD48c3Ryb25nPiAgICAqo7ogILi4wODWuNXrv8nS1NaxvdPWuM/y19PA4LbUz/M8L3N0cm9uZz48L3A+CjxwPjxzdHJvbmc+ICAgICqjuiAguLjA4NL908O/ydLU1rG909L908PX08DgttTP8zwvc3Ryb25nPjwvcD4KPHA+PHN0cm9uZz7KvsD9o7o8L3N0cm9uZz48L3A+CjxwPjxzdHJvbmc+PC9zdHJvbmc+PHByZSBjbGFzcz0="brush:java;">#include #include using namespace std; class Parent { protected: const char* name; public: Parent() { name = "Parent"; } void print() { cout<<"Name: "< name = "Child"; this->i = i; } }; int main(int argc, char *argv[]) { Child child(1000); Parent parent = child;//父类对象 Parent* pp = &child; // 父类指针 Parent& rp = child; // 父类引用 parent.print(); pp->print(); rp.print(); return 0; }


\


类在C++编译器内部可以理解为结构体

*: 子类是有父类成员叠加子类新成员得到的

\

四. 继承与构造

在子类对象构造的时候需要调用父类构造函数,对其继承得来的成员进行初始化

\

五.继承与析构

在子类对象析构的时候需要调用父类析构函数对其继承得来的成员进行清理

\

示例:

#include 
   
    
#include 
    
      using namespace std; class Parent { public: Parent(const char* s) { cout<<"Parent()"<<" "<
     
      
\

说明:

(1)子类对象在创建时会首先调用父类的构造函数
(2)父类构造函数执行结束后,在调用子类的构造函数
(3)当父类的构造函数有参数时,需要在子类的初始化表中显式调用
(4)析构函数调用的先后顺序与构造函数相反

六. 继承与组合的混搭

类中的成员变量可以是其他类的对象。

#include 
       
        
#include 
        
          using namespace std; class Object { public: Object(const char* s) { cout<<"Object()"<<" "<
         
          

七. 同名成员变量

当子类成员变量与父类成员变量同名时

*: 子类依然从父类继承同名成员

*: 在子类中通过作用域分辨符:: 进行同名成员区分

*: 同名成员存储在内存中的不同位置

#include 
           
            
#include 
            
              using namespace std; class Parent { public: int i; int f; }; class Child:public Parent { protected: int i; public: Child(int i,int j) { Parent::i=i; Child::i=j; Parent::f= i+j; f(); } void f() { cout<<"Parent::i= "<
              
                
              
<script type="text/java script">BAIDU_CLB_fillSlot("771048");
点击复制链接 与好友分享! 回本站首页
<script> function copyToClipBoard(){ var clipBoardContent=document.title + '\r\n' + document.location; clipBoardContent+='\r\n'; window.clipboardData.setData("Text",clipBoardContent); alert("恭喜您!复制成功"); }
<script>window._bd_share_config={"common":{"bdSnsKey":{},"bdText":"","bdMini":"2","bdMiniList":false,"bdPic":"","bdStyle":"0","bdSize":"24"},"share":{}};with(document)0[(getElementsByTagName('head')[0]||body).appendChild(createElement('script')).src='http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion='+~(-new Date()/36e5)];
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇c++命令提示符窗口下打印指定大小.. 下一篇POJ2431 Expedition(排序+优先队..

评论

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

·每日一道面试题-多线 (2025-12-26 06:20:17)
·java项目中哪些地方 (2025-12-26 06:20:14)
·Java真的是要没落了 (2025-12-26 06:20:12)
·C++ Lambda表达式保 (2025-12-26 05:49:45)
·C++ Lambda表达式的 (2025-12-26 05:49:42)