详细介绍C 类继承关系问题
创始人
2024-06-21 08:50:24
0

对***次接触到C++类继承的用户和学者来说,但是首先要对C++类继承的性质进行充分了解,那么就先说一下什么是C++类,所谓C++类:类是定义同一类所有对象的变量和方法的蓝图或原型。

1. public
从语义角度上来说,public继承是一种接口C++类继承,根据面向对象中的关系而言就是,子类可以代替父类完成父类接口所声明的行为,也就是必须符合“Liskov替换(LSP)”,此时子类可以自动转换成为父类的接口,完成接口转换。从语法角度上来说,public继承会保留父类中成员(包括函数和变量等)的可见性不变,也就是说,如果父类中的某个函数是public的,那么在被子类继承后仍然是public的。

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

就算通过类型转换(static_cast和dynamic_cast)也会得到一个空指针。从语法角度上来说,protected继承会将父类中的public可见性的成员修改成为protected可见性,相当于在子类中引入了protected成员,这样一来在子类中同样还是可以调用父类的protected和public成员,子类的子类就也可以调用被protected继承的父类的protected和public成员。

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

就算通过类型转换(static_cast和dynamic_cast)也会得到一个空指针。从语法角度上来说,private继承会将父类中的public和protected可见性的成员修改成为private可见性,这样一来虽然子类中同样还是可以调用父类的protected和public成员,但是在子类的子类就不可以再调用被private继承的父类的成员了。

  1. class CSample1 {  
  2.      protected:  
  3.          void printProtected() {}  
  4.      public:  
  5.          void printPublic() {}  
  6.      };  
  7.      class CSample2 : protected CSample1 {  
  8.        
  9.      };  
  10.      class CSample3 : public CSample2 {  
  11.          void print3() {  
  12.              printProtected();  
  13.              printPublic();  
  14.          }  
  15.      }; 

在面向对象的理论中有两种概念:接口、实现,所以就出现了所谓的接口继承和实现继承两种关系。而protected和private就是实现继承中所要用到的,其实protected和private两者则约束继承时并没有形成两种不同的继承类别,而仅仅只是为了方便C++类方法的传递调用而设计的。

其实在java这样面向对象要求更为严格的语言当中,没有实现继承,他必须通过委托方式来完成这一概念,如果熟悉java就会明白,如果一个对象要使用另外一个对象的接口功能,而自身又不能够充当该对象所扮演的角色时,就会通过委托来完成。

这样一来就必须在对象中包含一个委托对象,通过对象调用语法来完成功能;在C++中就可以通过protected和private继承来完成java中的委托关系(当然C++也可以形成对象委托关系),那么这种情况下protected继承就容许委托可以传递(也就是被多级子类调用),而private继承是不容许委托被传递的。

【编辑推荐】

  1. 简介学习C++总结之谈
  2. 对C++库函数进行学习探索总结笔记
  3. C++类库设计的基本构思与方法
  4. C++语言真的还有市场价值?
  5. C++类库设计的基本构思与方法

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
Windows恶意软件20年“... 在Windows的早期年代,病毒游走于系统之间,偶尔删除文件(但被删除的文件几乎都是可恢复的),并弹...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
着眼MAC地址,解救无法享受D... 在安装了DHCP服务器的局域网环境中,每一台工作站在上网之前,都要先从DHCP服务器那里享受到地址动...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...