public公有继承

protected保护继承

private私有继承

我们知道类的private和protected成员,在类外是不可以使用的.只有public成员可以在类外直接使用.

公有继承时,基类的private成员派生类也不可用,基类的public和protected成员在派生类中可直接使用.继承过来(变成派生类相应的public和protected成员)只有public成员在派生类外可以直接使用.

保护继承时,基类的private成员仍为有私有.基类的public和protected成员变成派生类的protected成员,这时在派生类外也不能直接使用原基类的public成员

私有继承时,基类的private成员仍为有私有.基类的public和protected成员将变成派生类的private成员.

举个例子.

class A

{

public:

int m_nTelNum;

protected:

int m_nAge;

private:

int m_nMoney;

};

class B:public A

{

void SetTelNum(int nTelNum)

{

m_nTelNum=nTelNum;

}

void SetAge(int nAge)

{

m_nAge=nAge;

}

void SetMoney(int nMoney)

{

m_nMoney=nMoney;//这里就出现错误,因为基类的private成员不能用.

}

};

B objB;//创建B类的对象objB

objB.m_nTelNum=123456;//可以

objB.m_nAge=30;//错误.public继承中基类的protected在派生类中是protected

objB.m_nMoney=100;//更错误,在派生类中都不可以直接使用.在类外就更不能了.

class C:protected A

{

void SetTelNum(int nTelNum)

{

m_nTelNum=nTelNum;

}

void SetAge(int nAge)

{

m_nAge=nAge;

}

void SetMoney(int nMoney)

{

m_nMoney=nMoney;//这里就出现错误,因为这是基类的private成员不能用.

}

};

C objC;//创建C类的对象objC

objC.m_nTelNum=123456;//注意这里和public的区别,这里错误,m_nTelNum变成了C类的protected成员

objC.m_nAge=30;//错误.protected继承中基类的protected在派生类中是protected,这与public同相

objC.m_nMoney=100;//更错误,在派生类中都不可以直接使用.在类外就更不能了.

class D:private A

{

void SetTelNum(int nTelNum)

{

m_nTelNum=nTelNum;

}

void SetAge(int nAge)

{

m_nAge=nAge;

}

void SetMoney(int nMoney)

{

m_nMoney=nMoney;//这里就出现错误,因为这是基类的private成员不能用.

}

};

D objD;//创建D类的对象objD

objD.m_nTelNum=123456;//错误,m_nTelNum变成了D类的private成员

objD.m_nAge=30;//错误.private继承中基类的protected在派生类中是private

objD.m_nMoney=100;//更错误,在派生类中都不可以直接使用.在类外就更不能了.

从例子来看,三种继承从派生类内部引用来看好像没有区别,只在类外引用时表现不同.现在还看不出public和protected继承的区别

那再看一个例子.

class E:public B

{

void SetTelNum(int nTelNum)

{

m_nTelNum=nTelNum;//可以 因为这是B的公有成员

}

void SetAge(int nAge)

{

m_nAge=nAge;//可以 因为这是B的保护成员,现成变成E的protected成员

}

void SetMoney(int nMoney)

{

m_nMoney=nMoney;//这个肯定不可以!

}

};

E objE;//

objE.m_nTelNum=123456;//可以

//其它的两个就不能用了.

class F:public C

{

void SetTelNum(int nTelNum)

{

m_nTelNum=nTelNum;//可以 因为这是C的保护成员,这里与public继承已经有区别但还没有表现出来

}

void SetAge(int nAge)

{

m_nAge=nAge;//可以 因为这是C的保护成员,现成变成E的protected成员

}

void SetMoney(int nMoney)

{

m_nMoney=nMoney;//这个肯定不可以!

}

};

F objF;

objF.m_nTel=123456;//错误,因为这是F的保护成员.注意与E类区别

class G:public D

{

void SetTelNum(int nTelNum)

{

m_nTelNum=nTelNum;//不可以 因为这是D的private成员,注意这里区别

}

void SetAge(int nAge)

{

m_nAge=nAge;//不可以 因为这是D的private成员,注意区别

}

void SetMoney(int nMoney)

{

m_nMoney=nMoney;//这个肯定不可以!

}

};

//那G在类外就没有了可以引用的继承过来成员了!

//这些继承方式是很难理解的.最好的办法就是多写代码去试.

c++中三种继承方式的区别的更多相关文章

  1. C++ 中三种继承方式的理解

    一.公有继承(public inheritance) 1.概念:当类的继承方式为公有继承时,基类的公有成员和保护成员的访问属性在派生类中不变,而基类的私有成员不可以直接访问. 实验一下:   我们用代 ...

  2. mfc 类三种继承方式下的访问

    知识点 public private protected 三种继承方式 三种继承方式的区别 public 关键字意味着在其后声明的所有成员及对象都可以访问. private 关键字意味着除了该类型的创 ...

  3. C++中的三种继承方式

    1,被忽略的细节: 1,冒号( :)表示继承关系,Parent 表示被继承的类,public 的意义是什么? class Parent { }; class Child : public Parent ...

  4. C++的三种继承方式详解以及区别

    目录 目录 C++的三种继承方式详解以及区别 前言 一.public继承 二.protected继承 三.private继承 四.三者区别 五.总结 后话 C++的三种继承方式详解以及区别 前言 我发 ...

  5. js的三种继承方式及其优缺点

    [转] 第一种,prototype的方式: //父类 function person(){ this.hair = 'black'; this.eye = 'black'; this.skin = ' ...

  6. C++的三种继承方式简述

    C++对父类(也称基类)的继承有三种方式,分别为:public继承.protected继承.private继承.三种继承方式的不同在于继承之后子类的成员函数的"可继承性质". 在说 ...

  7. C++继承(一) 三种继承方式

    继承定义 继承是使代码可以复用的重要手段,也是面向对象程序设计的核心思想之一. 继承就是不修改原有的类,直接利用原来的类的属性和方法并进行扩展.原来的类称为基类,继承的类称为派生类,他们的关系就像父子 ...

  8. c++三种继承方式public,protect,private

    C++中的三种继承public,protected,private 三种访问权限 public:可以被任意实体访问 protected:只允许子类及本类的成员函数访问 private:只允许本类的成员 ...

  9. C++三种继承方式

    一.三种继承方式 继承方式不同,第一个不同是的是派生类继承基类后,各成员属性发生变化.第二个不同是派生类的对象能访问基类中哪些成员发生变化.表格中红色标注.

随机推荐

  1. 【转】Pro Android学习笔记(七):了解Content Provider(下上)

    我们通过一个Content Provider小例子进行详细说明.数据源是一个SQLite数据库,名字为books.db,该数据库只含有一个表格,名字为books.表格中含有name,isbn,auth ...

  2. layout属性

    RelativeLayout 第一类:属性值为true可false android:layout_centerHrizontal        水平居中 android:layout_centerVe ...

  3. Linux命令总结_命令执行顺序

    有时候,我们需要一个命令执行完之后再去执行另一个命令,使用 &&和 ||可以完成 这样的功能,相应的命令可以是系统命令或shell脚本 Shell还提供了在当前shell或子shell ...

  4. sorted matrix - search & find-k-th

    sorted matrix ( Young Matrix ) search for a given value in the matrix: 1) starting from upper-right ...

  5. ios之Block研究

    Block的好处,我总结了下主要有2点:1.用于回调特别方便,2.可以延长对象的作用区域.但是,Block的内存管理这个模块一直不是很清楚,这个周末好好的看了下Block的原理,有些许心得. 为了性能 ...

  6. Ext.Net 复制GridPanel的数据

    Ext.Net 复制GridPanel的数据 2013-11-28 09:50:04|  分类: Ext.net |  标签: |举报 |字号大中小 订阅     CSS: <styletype ...

  7. C# 写 LeetCode easy #13 Roman to Integer

    13.Roman to Integer Roman numerals are represented by seven different symbols: I, V, X, L, C, D and  ...

  8. 3dmax室内设计,建筑视频

    第一教程篮球场 http://video.1kejian.com/video/?30800-0-1.html 第一课 元素级别-flip反转(直接看模型里面) 第二课 alt+r = ring crt ...

  9. DDD 落地的具体思路

    学习 DDD 的朋友有两种,一种是看 DDD 经典书籍 <领域驱动设计:软件核心复杂性应对之道>完全看不懂,第二种是看啥都懂,都觉得有道理,但总是落不了地. 我们总结一下我们自己落地的思路 ...

  10. King's Pilots

    题目链接   (双层图, 一层维护工作,一层维护政策) #include <bits/stdc++.h> using namespace std; inline int read() { ...