文档章节

C++面向对象开发:继承、多态、重载及访问修饰符

牛牛牛大棚
 牛牛牛大棚
发布于 2016/02/04 10:15
字数 1477
阅读 16
收藏 0
点赞 1
评论 0

一、继承

1、 定义和作用

C++继承机制是利用已有的数据类型来定义新的数据类型,用来派生新类的类称为基类或父类,由已存在的类派生出的新类称为派生类或子类。派生类不仅拥有新定义的成员,同时拥有基类的成员。

一个派生类可以从一个基类或多个基类派生,前者称为单继承,后者称为多继承。

1)单继承的定义格式如下:

class<派生类名>:<继承方式><基类名>

{

<派生类新定义成员>

};

2)多继承的定义格式如下:

              class<派生类名>:<继承方式1><基类名1>,<继承方式2><基类名2>,…

              {

                     <派生类新定义成员>

};

继承可以扩展已存在的代码,目的是代码复用。

 

2、 继承方式

       公有继承(public)、私有继承(private)、保护继承(protected)是常用的三种继承方式。

1)公有继承(public)

公有继承的特点是基类的公有成员和保护成员作为派生类的成员时,它们都保持原有的状态,而基类的私有成员仍然是私有的,不能被这个派生类的子类所访问。

2)私有继承(private)

私有继承的特点是基类的公有成员和保护成员都作为派生类的私有成员,并且不能被这个派生类的子类所访问。

3)保护继承(protected)

保护继承的特点是基类的所有公有成员和保护成员都成为派生类的保护成员,并且只能被它的派生类成员函数或友元访问,基类的私有成员仍然是私有的。

在不同的继承方式下,派生类对基类的成员访问权限如下表所示:

继承方式\成员类型

public

protected

private

public

public

protected

不可见

protected

protected

protected

不可见

private

private

private

不可见

       如果继承方式,class默认采用私有继承,而struct默认的是public继承。

 

二、多态

1、 定义和作用

C++多态性可以简单地概括为“一个接口,多种方法”。父类对象可以根据当前子类对象赋值的特性在运行时决定调用的函数,允许子类类型的指针赋值给父类类型的指针。多态是面向对象编程领域的核心概念。

       多态的目的为了接口重用,无论传递过来的对象属于哪个类,函数都可以通过同一个接口调用到适应不同对象的实现方法。

 

2、 实现方式

      C++中有两种实现多态的方式,分别是重载和覆盖。

1) 重载

重载是允许有多个同名的函数,但这些函数的参数列表不同,如参数个数不同和参数类型不同等。这些同名函数的调用在编译过程就确定了调用地址,编译器会根据这些函数的不同参数列表,将同名函数的名称做修饰,从而生成一些不同名称的预处理函数,属于静态绑定(早绑定)。

例如,有两个同名函数: void func(int num)和void func(string name),那么编译器做过修饰后的函数名称可能是int_func和str_func。

实际,重载只是一种语言特性,与多态无关,与面向对象也无关。

2) 覆盖

覆盖是指子类对父类的虚函数重定义。虚函数是在一般函数前面加上virtual。通过声明父类的指针,利用该指针指向一个子类对象,调用相应的虚函数,可以根据指向的子类的不同而实现不同的方法。对虚函数的调用在编译过程中不能确定,在运行时才能确定,属于动态绑定(晚绑定)。

3、 纯虚函数

纯虚函数是在父类中声明的未定义的虚函数,函数原型后加上“=0”,如virtual void func()=0。编译器要求在任何子类中都需要重定义纯虚函数,以实现多态性。

       含有纯虚函数的类称为抽象类,不能定义抽象类的对象。


3、 示例

#include <iostream>
#include <stdlib.h>
#include <time.h>

using namespace std;

class Father
{
public:
    Father(){}
    ~Father(){}
    void func()
    {
        cout << "1" << endl;
    }
    virtual void function()
    {
        cout << "2" << endl;
    }
};

class Child : public Father
{
public:
    Child(){}
    ~Child(){}
    void func()
    {
        cout << "3" << endl;
    }
    void function()
    {
        cout << "4" << endl;
    }
};

int main()
{
    Father father;
    Child child;
    father.func();
    father.function();
    child.func();
    child.function();

    Father *fa = new Father();
    fa = &father;
    fa->func();
    fa->function();
    fa = &child;
    fa->func();
    fa->function();

    return 0;
}

      执行结果:1,2,3,4   1,2,1,4   3,2,3,4

      执行结果可以看出,父类对象在调用function()函数时根据子类对象选择了不同的方法。


三、重载

1、 定义

重载是允许有多个同名的函数,但这些函数的参数列表不同,如参数个数不同和参数类型不同等。

重载与重写的区别就在于是否覆盖,重写一般多发生在不同的类且存在继承关系之间,而重载多是在一个类里或者一块代码段里。

 

2、 实现方式

重载函数的函数名必须相同,参数列表必须不同,返回值可以相同也可以不同。例如,void func(int num)和void func(string name)就属于重载。


3、 示例

#include <iostream>
#include <stdlib.h>
#include <time.h>

using namespace std;

void func(int num)
{
    cout << num << endl;
}

void func(string name)
{
    cout << name.c_str() << endl;
}

int main()
{
    int num = 1;
    string name = "liu";
    func(num);
    func(name);

    return 0;
}

     执行结果:1  liu  

     执行结果可以看出,在调用func()函数时会根据参数的不同选择相应的函数实现。


四、访问修饰符

1、 定义

      public:所有范围都能访问;

      protected:类自身和派生类能访问;

      private:类自身能访问。


© 著作权归作者所有

共有 人打赏支持
牛牛牛大棚
粉丝 0
博文 11
码字总数 11265
作品 0
苏州
程序员
【Java】疯狂Java基础(一)——面向对象的特征:继承、封装和多态

一、前言 小编记得,刚接触计算机相关的课程的时候,接触的是c++,c++的老师一上来就说c++是面向对象的,c语言是面向过程的。面向对象比面向过程厉害,是从面向过程发展过来的的。 当时有一个...

kisscatforever ⋅ 03/28 ⋅ 0

精选的这19道C/C+面试题,你能答对多少呢?

软件工程师的面试,套路都差不多,这一次约到的问题,下次你可能还会遇到。 问1:请用简单的语言告诉我C++ 是什么? 答:C++是在C语言的基础上开发的一种面向对象编程语言,应用广泛。C++支持...

悟空_b201 ⋅ 06/02 ⋅ 0

C++中重载、重写(覆盖)的区别实例分析

本文实例讲述了C++中重载、重写(覆盖)和隐藏的区别,对于C++面向对象程序设计来说是非常重要的概念。具体分析如下: 1.重载:重载从overload翻译过来,是指同一可访问区内被声明的几个具有...

h8b6pk7m7r8 ⋅ 01/08 ⋅ 0

C++灵魂所在之---多态的前世与今生

开头先送大家一句话吧: 众所周知,在20世纪80年代早期,C++在贝尔实验室诞生了,这是一门面向对象的语言,但它又不是全新的面向对象的语言,它是在传统的语言(C语言)进行面向对象扩展而来...

loving_forever_ ⋅ 2016/06/13 ⋅ 0

C语言/C++编程学习—神奇设计模式代码之群星

C语言是面向过程的,而C++是面向对象的 C和C++的区别: C是一个结构化语言,它的重点在于算法和数据结构。C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到...

小辰带你看世界 ⋅ 03/26 ⋅ 0

小朋友学C++(4):public, protected, private

面向对象有三大特征:封装、继承、多态。(具体会在之后的课程里讲) C++用三个关键词来表示访问范围:public, protected, private。 public和private作用就是实现封装。类外的代码可以访问p...

海天一树X ⋅ 03/27 ⋅ 0

大神有话说之c++,还在迷茫的朋友可以来看一下

C++ 是一种中级语言,它是由 Bjarne Stroustrup 于 1979 年在贝尔实验室开始设计开发的。C++ 进一步扩充和完善了 C 语言,是一种面向对象的程序设计语言。C++ 可运行于多种平台上,如 Window...

悟空_b201 ⋅ 05/30 ⋅ 0

绕开“陷阱“,阿里专家带你深入理解C++对象模型的特殊之处

摘要:本文介绍了C++对象模型的特殊之处,包括与C兼容的朴素模型,以及能支持多态的虚表模型,同时还带大家了解了构造函数与析构函数相关的一些特性与陷阱。这些内容能够帮助大家更好地学习和...

nirvanalucky ⋅ 04/25 ⋅ 0

C/C++之C及C++发展史及标准

Tips:  1. 本人当初学习C/C++的记录。  2. 资源很多都是来自网上的,如有版权请及时告知!  3. 可能会有些错误。如果看到,希望能指出,以此共勉! C和C++   C++是C语言的一个超集。C...

zcshoucsdn ⋅ 2017/03/06 ⋅ 0

Android 网络编程 目录

Android 网络编程 目录 Android 网络编程1 Http协议 to be continued... Android 架构师之路 目录 Android 架构师之路1 UML图之用例图 Android 架构师之路2 UML图之类图 Android 架构师之路3...

香沙小熊 ⋅ 06/21 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

个人博客的运营模式能否学习TMALL天猫质量为上?

心情随笔|个人博客的运营模式能否学习TMALL天猫质量为上? 中国的互联网已经发展了很多年了,记得在十年前,个人博客十分流行,大量的人都在写博客,而且质量还不错,很多高质量的文章都是在...

原创小博客 ⋅ 46分钟前 ⋅ 0

JavaScript零基础入门——(十一)JavaScript的DOM操作

JavaScript零基础入门——(十一)JavaScript的DOM操作 大家好,欢迎回到我们的JavaScript零基础入门。最近有些同学问我说,我讲的的比书上的精简不少。其实呢,我主要讲的是我在开发中经常会...

JandenMa ⋅ 今天 ⋅ 0

volatile和synchronized的区别

volatile和synchronized的区别 在讲这个之前需要先了解下JMM(Java memory Model :java内存模型):并发过程中如何处理可见性、原子性、有序性的问题--建立JMM模型 详情请看:https://baike.b...

MarinJ_Shao ⋅ 今天 ⋅ 0

深入分析Kubernetes Critical Pod(一)

Author: xidianwangtao@gmail.com 摘要:大家在部署Kubernetes集群AddOn组件的时候,经常会看到Annotation scheduler.alpha.kubernetes.io/critical-pod"="",以表示这是一个关键服务,那你知...

WaltonWang ⋅ 今天 ⋅ 0

原子性 - synchronized关键词

原子性概念 原子性提供了程序的互斥操作,同一时刻只能有一个线程能对某块代码进行操作。 原子性的实现方式 在jdk中,原子性的实现方式主要分为: synchronized:关键词,它依赖于JVM,保证了同...

dotleo ⋅ 今天 ⋅ 0

【2018.06.22学习笔记】【linux高级知识 14.4-15.3】

14.4 exportfs命令 14.5 NFS客户端问题 15.1 FTP介绍 15.2/15.3 使用vsftpd搭建ftp

lgsxp ⋅ 今天 ⋅ 0

JeeSite 4.0 功能权限管理基础(Shiro)

Shiro是Apache的一个开源框架,是一个权限管理的框架,实现用户认证、用户授权等。 只要有用户参与一般都要有权限管理,权限管理实现对用户访问系统的控制,按照安全规则或者安全策略控制用户...

ThinkGem ⋅ 昨天 ⋅ 0

python f-string 字符串格式化

主要内容 从Python 3.6开始,f-string是格式化字符串的一种很好的新方法。与其他格式化方式相比,它们不仅更易读,更简洁,不易出错,而且速度更快! 在本文的最后,您将了解如何以及为什么今...

阿豪boy ⋅ 昨天 ⋅ 0

Python实现自动登录站点

如果我们想要实现自动登录,那么我们就需要能够驱动浏览器(比如谷歌浏览器)来实现操作,ChromeDriver 刚好能够帮助我们这一点(非谷歌浏览器的驱动有所不同)。 一、确认软件版本 首先我们...

blackfoxya ⋅ 昨天 ⋅ 0

线性回归原理和实现基本认识

一:介绍 定义:线性回归在假设特证满足线性关系,根据给定的训练数据训练一个模型,并用此模型进行预测。为了了解这个定义,我们先举个简单的例子;我们假设一个线性方程 Y=2x+1, x变量为商...

wangxuwei ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部