C++类继承关系问题

转载 2013年12月04日 12:58:11

在C++中继承主要有三种关系:publicprotectedprivate。这三种继承关系中public继承是最为常用的一种继承关系,代表了接口继承含义,而他们分别具体代表了什么含义呢?

 

1. public

 

   从语义角度上来说,public继承是一种接口继承,根据面向对象中的关系而言就是,子类可以代替父类完成父类接口所声明的行为,也就是必须符合“Liskov替换原则(LSP)”,此时子类可以自动转换成为父类的接口,完成接口转换。

   从语法角度上来说,public继承会保留父类中成员(包括函数和变量等)的可见性不变,也就是说,如果父类中的某个函数是public的,那么在被子类继承后仍然是public的。

  

2. protected

 

   从语义角度上来说,protected继承是一种实现继承,根据面向对象中的关系而言就是,   子类不能代替父类完成父类接口所声明的行为,也就是不符合“Liskov替换原则(LSP)”,此时子类不能自动转换成为父类的接口,就算通过类型转换(static_cast和dynamic_cast)也会得到一个空指针。

   从语法角度上来说,protected继承会将父类中的public可见性的成员修改成为protected可见性,相当于在子类中引入了protected成员,这样一来在子类中同样还是可以调用父类的protected和public成员,子类的子类就也可以调用被protected继承的父类的protected和public成员。

   例如:

class CSample1

{

protected:

     void printProtected()

     {

     }

 

public:

     void printPublic()

     {

     }

};

 

class CSample2 : protected CSample1

{

};

 

class CSample3 : public CSample2

{

     void print3()

     {

         printProtected();

         printPublic();

     }

};

 

3. private

 

   从语义角度上来说,private继承是一种实现继承,根据面向对象中的关系而言就是,子类不能代替父类完成父类接口所声明的行为,也就是不符合“Liskov替换原则(LSP)”,此时子类不能自动转换成为父类的接口,就算通过类型转换(static_cast和dynamic_cast)也会得到一个空指针。

   从语法角度上来说,private继承会将父类中的public和protected可见性的成员修改成为private可见性,这样一来虽然子类中同样还是可以调用父类的protected和public成员,但是在子类的子类就不可以再调用被private继承的父类的成员了。

class CSample1

{

protected:

     void printProtected()

     {

     }

 

public:

     void printPublic()

     {

     }

};

 

class CSample2 : private CSample1

{

};

 

class CSample3 : public CSample2

{

     void print3()

     {

         printProtected(); // 编译错误,不可以调用该函数

         printPublic();    // 编译错误,不可以调用该函数

     }

};

 

    在面向对象的理论中有两种概念:接口、实现,所以就出现了所谓的接口继承和实现继承两种关系。而protected和private就是实现继承中所要用到的,其实protected和private两者则约束继承时并没有形成两种不同的继承类别,而仅仅只是为了方便C++类方法的传递调用而设计的,其实在java这样面向对象要求更为严格的语言当中,没有实现继承,他必须通过委托方式来完成这一概念,如果熟悉java就会明白,如果一个对象要使用另外一个对象的接口功能,而自身又不能够充当该对象所扮演的角色时,就会通过委托来完成,这样一来就必须在对象中包含一个委托对象,通过对象调用语法来完成功能;在C++中就可以通过protected和private继承来完成java中的委托关系(当然C++也可以形成对象委托关系),那么这种情况下protected继承就容许委托可以传递(也就是被多级子类调用),而private继承是不容许委托被传递的。

C++类继承关系问题

     C++类继承关系问题    在C++中继承主要有三种关系:public、protected和private。这三种继承关系中public继承是最为常用的一种继承关系,代表了接口继承含义,而他...
  • metasearch
  • metasearch
  • 2008年05月16日 15:15
  • 673

C++类继承关系问题

  C++类继承关系问题本文转自:http://www.cppblog.com/chemz/archive/2007/05/31/25189.html    在C++中继承主要有三种关系:public...
  • danieldaniel19851023
  • danieldaniel19851023
  • 2010年04月06日 09:12
  • 259

类(继承)的内存分配详解

1.基类与派生类的内存分配 派生类继承基类       内存分配时,是在于基类对象不同的内存地址处,按基类的成员变量类型,开辟一个同样的类型空间,但注意开辟后派生对象的空间,不是复制基类的成员的值...
  • vainlyhopelim
  • vainlyhopelim
  • 2015年08月18日 16:38
  • 1782

QT类继承关系图

对于嵌入式设备几个关键对象: 屏幕 光标 键盘 QShared |---QGLayoutIterator |          |---QLayoutArrayIterator | ...
  • xingzheouc
  • xingzheouc
  • 2015年03月31日 11:55
  • 2207

C++类继承关系

C++类继承关系问题 在C++中继承主要有三种关系:public、protected和private。这三种继承关系中public继承是最为常用的一种继承关系,代表了接口继承含义,而他们分别具体代表了...
  • wang7890
  • wang7890
  • 2009年02月15日 03:17
  • 13993

MFC 类继承关系图

图片太大,可保存下来或拖动图片再开一个新网页.
  • tmljs1988
  • tmljs1988
  • 2011年03月01日 15:06
  • 5481

C++学习第12篇-类的继承

1. 继承介绍 上一篇中,已介绍了复合类,复合类只是C++中创建复杂类的主要方法之一。 本篇中,介绍另外一种方法,即类的继承。 与复合类通过结合和连接其他对象进行创建新的对象;继承,通过直接获取...
  • zuheyawen
  • zuheyawen
  • 2012年03月28日 11:41
  • 10932

C++中的继承关系

C++中的继承关系 一、继承概念 继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能。这样产生新的类,称派生类。继...
  • eagle_1036077338
  • eagle_1036077338
  • 2016年11月08日 12:50
  • 1282

OSG绘制几何体学习总结(超全)

在osg中,场景图形采用一种自顶向下的,分层的树状数据结构来组织空间数据集,以提高渲染的效率 场景图形树结构的顶部是一个根节点,从根节点向下延伸,各个组节点中均包含了几何信息和用于控制其外观的渲染状...
  • hudfang
  • hudfang
  • 2015年07月02日 11:41
  • 2467

19章 20章 C++中继承的用法 iostream库

1、 Dynamic_cast操作符可以用来把一个类类型对象的指针转换成同一层次结构中的其他类的指针,同时也可以用它把一个类类型对象的左值转换成同一类层次结构中其他类的引用,注意dynamic_cas...
  • digu
  • digu
  • 2007年07月13日 16:43
  • 1572
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++类继承关系问题
举报原因:
原因补充:

(最多只允许输入30个字)