`
fireDragonpzy
  • 浏览: 474578 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

c++基础知识(一)C++类继承关系问题

c++ 
阅读更多
在C++中继承主要有三种关系:public、protected和private。这三种继承关系中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
继承是不容许委托被传递的。


摘自:http://www.cppblog.com/chemz/archive/2007/05/31/25189.aspx
分享到:
评论

相关推荐

    c++基本知识点汇总

    C++编程语言的基本知识点还包括了类和对象、继承与多态、模板编程、异常处理、STL标准模板库等。类和对象是面向对象编程的核心,它允许将数据和操作数据的函数封装在一起。继承是类的一种复用机制,允许新创建的类...

    C++ 基础知识 C++ 基础知识

    在学习C++基础知识时,你需要掌握以下几个关键点: 1. **基础语法**:C++的基础语法与C语言相似,包括变量声明、数据类型(如int、char、float等)、运算符(如算术运算符、比较运算符、逻辑运算符等)、流程控制...

    c++基础知识.zip

    继承是C++中的一个关键特性,允许一个类(子类或派生类)从另一个类(父类或基类)继承属性和行为。这有助于代码重用和构建分层的类结构。通过继承,子类可以扩展或修改父类的功能,而无需重复编写相同的代码。例如...

    c++继承分类

    C++继承是面向对象编程(OOP)中的一个核心概念,它允许我们创建新的类,这些新类可以扩展已存在的类的功能。在这个“c++继承分类”主题中,我们将深入探讨C++中的继承机制,以及如何在Qt环境中利用这一特性进行开发...

    C++基础知识讲义v2

    这份"C++基础知识讲义v2"是一份专为初学者和初级C++讲师设计的学习资料,涵盖了C++的基础概念和关键特性。 1. **编程入门**(c++基礎知識1編程入門.pps):这部分通常会介绍C++的历史、基本语法,如变量声明、数据...

    c++基础知识chm文件

    C++基础知识.chm文件提供了详细的C++教程,包括各个主题的索引,对于学习者来说是非常有价值的参考资料。 理解并掌握这些C++基础知识是成为熟练C++程序员的关键步骤。通过深入学习和实践,你可以逐步掌握这个强大...

    编程语言C++基础知识课件

    C++是一种强大的、通用的编程语言,由Bjarne Stroustrup在1979年设计并开发,...这份"编程语言C++基础知识课件"将引导你逐步掌握这个强大语言的关键概念,无论你是初学者还是有一定经验的开发者,都将从中受益匪浅。

    C++类继承,访问权限,有源码参考

    - **单一继承**:一个子类只能继承一个基类,这是C++最初支持的继承方式,有助于避免类的混乱和冲突。 - **多重继承**:一个子类可以继承多个基类,这使得子类可以融合多个基类的特性。C++也支持这种形式的继承,...

    C++课后小练习(类、继承、多态等有关小程序)

    通过解决这些课后练习,初学者不仅能巩固基础知识,还能提升问题解决能力和编程技巧。 总的来说,这个C++课后小练习涵盖了面向对象编程的核心概念,通过实践这些小程序,你将更好地理解类的设计、继承的层次结构...

    c++程序设计 继承与派生实验(二)

    在C++编程语言中,继承和派生是面向对象编程的重要概念,它们允许我们构建复杂的类层次结构,实现代码重用和...通过实践这些知识点,你可以更深入地理解和掌握C++的继承和派生机制,为今后的面向对象编程打下坚实基础。

    C++基础知识.doc

    C++基础知识 C++基础知识是C++入门者和面试C++工程师岗位前的必备知识点总结。它涵盖了语法语义、STL、排序算法等面试常问的知识点。 一、面向对象的程序设计思想 面向对象的程序设计思想是把数据结构和对数据...

    计算机二级C++公共基础知识总结及历年试题.pdf

    1. C++基础知识:C++作为一种高级编程语言,其基础知识包括变量、数据类型、运算符、控制结构(如条件语句和循环)、函数、数组、指针和引用等。这些都是程序员编写程序时必须掌握的基本概念。 2. 面向对象编程...

    C++基础课件,讲述C++基础知识

    本基础课件旨在全面介绍C++的基础知识,帮助初学者理解和掌握C++编程的基本概念和技术。 课件内容可能涵盖以下几个关键知识点: 1. **C++简介**:介绍C++的历史、特点和适用领域,以及与C语言的区别。 2. **基本...

    C++经典练习,从基本的到C++所有知识点

    本资料包是专为C++初学者和进阶者设计的一系列练习,旨在帮助你从基础到高级,全面理解和掌握C++的所有关键知识点。每个知识点都以独立的.doc文档形式呈现,便于学习和查阅。 一、运算符与表达式 C++中的运算符是...

    c++j基础知识课件

    作为C++的基础知识,我们首先要理解它的历史背景。C++是由Bjarne Stroustrup在1979年基于C语言的基础上发展起来的,旨在提供一种面向对象的编程能力,同时保留C语言的效率。 1. **基础语法**:C++的基础语法与C语言...

    C++基础知识总结

    C++是一种强大的编程语言,它结合了面向对象编程(OOP)和传统的面向过程编程的特点。C++的基础知识涵盖了许多核心概念,...无论是初学者还是经验丰富的开发者,都需要扎实的C++基础知识来编写高效、可靠的软件系统。

    c++ 图形面积计算 利用继承与多态

    通过这个项目,初学者不仅可以学习到C++的基础知识,还能了解到面向对象编程中的核心概念,以及如何将这些概念应用于实际问题中。对于后续更复杂的问题,如动态对象创建、模板类等,这个项目提供了一个良好的起点。

    c++基础知识电子书

    本电子书“C++基础知识”旨在为初学者提供一个全面且实用的C++学习资源,帮助他们从零开始掌握这门语言。 C++起源于C语言,由Bjarne Stroustrup在1983年为了增加面向对象的特性而设计。它不仅继承了C语言的高效和...

Global site tag (gtag.js) - Google Analytics