文档章节

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

牛牛牛大棚
 牛牛牛大棚
发布于 2016/02/04 10:15
字数 1477
阅读 17
收藏 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
0
《鸡啄米C++编程入门系列》系列技术文章整理收藏

《鸡啄米C++编程入门系列》系列技术文章整理收藏 1鸡啄米:C++编程入门系列之前言 http://www.lai18.com/content/410454.html 2鸡啄米:C++编程入门系列之一(进制数) http://www.lai18.com...

开元中国2015
2015/06/27
0
0
精选的这19道C/C+面试题,你能答对多少呢?

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

悟空_b201
06/02
0
0
复习C++基础知识-----“我的第一本C++”读书笔记1

Debug : 在单独运行时,往往需要编译器提供一些库文件 Release : 可以在没有安装visual c++的computer上正常运行 常规设置 1) 在共享DLL中使用MFC : 表示把程序中用到的MFC类库作为动态链接库...

OScoder2
2014/04/08
0
0
Effective C++ Notes(读书笔记)

1,视C++为一种语言联邦,大致分为4个部分: A)C。说到底C++仍是以C为基础。区块、语句、预处理器、内置数据类型、数组、指针等等统统来自C。 B)Object-Oriented C++。这部分也就是C with ...

borey
2014/10/12
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

人生苦短:Python里的17个“超赞操作

人生苦短,我选Python”。那么,你真的掌握了Python吗? 1. 交换变量 有时候,当我们要交换两个变量的值时,一种常规的方法是创建一个临时变量,然后用它来进行交换。比如: # 输入 a = 5 b ...

糖宝lsh
37分钟前
4
0
咕泡-spring中常用设计模式概述

设计模式就是经验之谈,供后人借鉴,解决一些具有代表性的问题 设计模式来源于生活,反过来帮助我们更好生活 设计模式提升代码的可读性、可扩展性、维护成本、复杂业务问题 千万不要死记硬背...

职业搬砖20年
今天
2
0
day59-20180817-流利阅读笔记-待学习

假·照骗,真·社交焦虑 雪梨 2018-08-17 1.今日导读 发朋友圈之前,不少人为了展现更美好的生活状态会对照片加以“微调”,或是加个滤镜显得逼格更高,或是磨个皮瘦个脸拉个大长腿。现在,国...

aibinxiao
今天
18
0
OSChina 周五乱弹 —— 姑娘在这个节日里表白你接受么?

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @Sharon啊:完全被这个小姐姐圈粉了,学两首她的歌去哈哈 分享王贰浪的单曲《往后余生(翻自 马良)》 《往后余生(翻自 马良)》- 王贰浪 手...

小小编辑
今天
846
16
为什么HashMap要自己实现writeObject和readObject方法?

为什么HashMap要自己实现writeObject和readObject方法? 如果你有仔细阅读过HashMap的源码,那么你一定注意过一个问题:HashMap中有两个私有方法。 private void writeObject(java.io.Objec...

DemonsI
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部