0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

C/C++之面向对象编程思想1

jf_78858299 来源:小余的自习室 作者:小余的自习室 2023-03-30 15:14 次阅读

前言

C++作为一门在C和Java之间的语言,其既可以使用C语言中的高效指针,又继承了Java中的面向对象编程思想,在去年编程语言排行榜上更是首次超过Java,进入前三。

今天这篇文章就来讲解下C++中的 面向对象编程思想 。说到面向对象编程,就要讲到对象的三大特性: 封装,继承和多态 。本篇文章就以这三个特性展开。

目录

封装

封装是面向对象编程三大特性之一。

核心思想1 :将属性和行为作为一个整体来表现生活中的事物。

class People {
public:
    string name;
    void eat();
privatestring sex;
};

注意: 类中的属性和行为统称为成员属性成员称为成员变量,行为成员称为成员函数

核心思想2 :对属性和行为使用权限控制

面向对象编程中的权限包括:

  • 1.public 公共权限,所有类中都可以访问
  • 2.protected 受保护权限,只有当前类和子类可以访问
  • 3.private 私有权限,只有当前类可以访问。

一般封装原则:

对所有成员变量使用private权限,并使用public成员函数set和get对成员变量进行读写操作,可以防止成员变量对外暴露。

继承

继承是面向对象编程过程中一个很重要的特性,它允许开发者保存原有类的特性基础上进程扩展,增加功能等。 新继承的类称为派生类(java中习惯叫子类),而被继承的类称为基类(java中习惯叫父类)。

对于有java基础的同学来说再熟悉不过了,所以对于Android开发者来说,对C++上手会比其他程序员更快些,虽然字面意思类似,但是C++的继承和java还是有很多区别的,下面小余会一一道来。

继承的格式

class 派生类名:继承方式 基类的名称
class A :public B

继承基础代码:

class Father {
public:
    string name = "father";
    int age = 45;
};
class Son :public Father {
public:
    string sex = "male";
    void print() {
        cout << "name:" << name << " age:" << age << " sex:" << sex << endl;
    }
};

void extendsTest::mainTest()
{
    Son son;
    son.print();
};
打印结果:
name:father age:45 sex:male

基类中的name和age是子类和父类共有的成员变量,每个人都有名字和年龄,虽然子类中没有定义,但是可以从父类中继承过来,这就是继承的意义。

而sex属性是子类Son中独有的成员变量。父类独有的元素可以使用private修饰,表示这个元素属于当前父类持有,子类也不可获取,这个大家都理解。

这里要说下在子类定义继承过程中对父类的继承方式是有说法的 :如下的public

class Son :public Father
类成员/继承方式 public继承 protected继承 private继承
父类的public成员 子类的public成员 子类的protected成员 子类private成员
父类的protected成员 子类的protected成员 子类的protected成员 子类private成员
父类的private成员 子类不可见 子类不可见 子类不可见

权限记住规则:

子类的权限受限于父类的权限以及子类继承的方式,子类对父类的继承方式只是对父类的成员进行再封装,大部分情况下使用public继承方式即可。除非不想让其他类引用该类的父类元素。

子类与父类有同名属性或者方法

假设子类有父类同名元素,则优先使用子类的元素

class Father {
public:
    string name = "father";
    int age = 45;
};
class Son :public Father {
public:
    string sex = "male";
    string name = "son";
    void print() {
        cout << "name:" << name << " age:" << age << " sex:" << sex << endl;
    }
};

void extendsTest::mainTest()
{
    Son son;
    son.print();
};

打印结果:
name:son age:45 sex:male

如果此时一定需要访问父类的元素呢?加上父类修饰符即可。

void print() {
    cout << "name:" << Father::name << " age:" << age << " sex:" << sex << endl;
}

同名方法呢?这里就涉及到了面向对象编程中的函数重载多态问题了,后面再讲解

单继承和多继承

C++中的继承不像java中那样,只能继承一个父类,C++中可以继承多个父类, 所以就有单继承和多继承的区别:

单继承

只有一个父类

class Apublic B{

}

多继承

有多个父类

class A:public B,public C {

}

菱形继承

菱形继承图:

图片

菱形继承会有啥问题呢?

class A {
public:
    string name;
};
class B :public A {
public:
    int age;
};
class C :public A {
public:
    string sex;
};
class D :public B, public C {
public:
    int id;
};
int main()
{
    D student;
    student.name = "小明";
    student.age = 18;
    student.sex = "男";
    student.id = 666;
    return 0;
}

问题出来了:

图片

原因是B和C同时继承了A,所以B和C同时都拥有name属性,直接使用student.name,编译器无法确定name是属于哪个类,此时有以下解决方法:

  • 方式1 :明确指明当前name属于哪个类
student.B::name = "小明";
  • 方式2 :虚继承:在继承方式前加上virtual。
class B :virtual  public A {
public:
    int age;
};
class C :virtual public A {
public:
    string sex;
};

多继承是C++复杂的一个体现。有了多继承,就存在菱形继承,为了解决菱形继承,又出现了菱形虚拟继承,其底层实现又很复杂。所以 一般不建议设计出多继承,一定不要设计出菱形继承

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • JAVA
    +关注

    关注

    19

    文章

    2904

    浏览量

    103000
  • C++
    C++
    +关注

    关注

    21

    文章

    2066

    浏览量

    72901
  • 面向对象编程

    关注

    0

    文章

    22

    浏览量

    1767
收藏 人收藏

    评论

    相关推荐

    面向对象思想让裸编程带上灵魂

    告诉我:写好的程序不是如何去完成代码,而是如何去组织代码,是如何组织,不是组织。上位机中面向对象编程思想,就是一个非常可取的思想
    发表于 11-24 10:00

    Labview 之面向对象编程。 里面有个例子 和视频教程地址

    Labview 之面向对象编程。 里面有个例子 和视频教程地址Labview 之面向对象编程
    发表于 12-29 10:16

    LabVIEW面向对象之学习路线图

    众所周知,面向对象的程序设计是一种设计思想,它不依托于某种编程语言。C++C#、LabVIEW
    发表于 07-01 12:13

    如何用C语言实现面向对象编程

    1C语言实现面向对象编程GOF的《设计模式》一书的副标题叫做“可复用面向
    发表于 07-12 07:24

    c语言实现面向对象编程 精选资料分享

    c语言的面向对象框架(以RT-Thread软件包rt-robot为例)概述  有一种说法是c语言是一门面向过程的语言,其实这种说法是比较浅显
    发表于 09-02 07:46

    谈谈面向对象编程

    工业控制系统的PLC程序中也可以采用这种设计思想,虽然我们无法实现面向对象的很多优秀特点如“继承”,甚至于它根本就不具备面向对象
    发表于 09-08 07:47

    面向对象编程介绍

    5.项目案例: 栈与队列的封装5.1 栈的封装5.2 队列的封装一、面向对象编程介绍1.面向过程编程
    发表于 12-13 07:22

    STM32 C++代码封装初探相关资料推荐

    一、STM32与面向对象编程上一章中提到了,C++的核心之一就在于面向对象
    发表于 02-11 06:05

    C++ 面向对象多线程编程下载

    C++ 面向对象多线程编程下载
    发表于 04-08 02:14 70次下载

    面向对象的程序设计(C++

    面向对象的程序设计(C++).面向对象的基本思想 C++
    发表于 03-22 14:40 0次下载

    C#入门教程之面向对象编程简介的详细资料概述

    本文档的主要内容详细介绍的是C#入门教程之面向对象编程简介的详细资料概述主要学习的目标是1.面向对象编程
    发表于 12-05 11:54 35次下载
    C#入门教程<b class='flag-5'>之面向</b><b class='flag-5'>对象</b><b class='flag-5'>编程</b>简介的详细资料概述

    嵌入式C语言面向对象编程应用及优势

    既然面向对象是一种编程思想,而编程语言只是一种工具,那么,思想与工具之间就不存在一种强耦合的关系
    发表于 11-10 12:00 1124次阅读
    嵌入式C语言<b class='flag-5'>面向</b><b class='flag-5'>对象</b><b class='flag-5'>编程</b>应用及优势

    C/C++之面向对象编程思想2

    C++作为一门在C和Java之间的语言,其既可以使用C语言中的高效指针,又继承了Java中的面向对象编程思想,在去年
    的头像 发表于 03-30 15:14 411次阅读
    C/<b class='flag-5'>C++</b><b class='flag-5'>之面向</b><b class='flag-5'>对象</b><b class='flag-5'>编程</b><b class='flag-5'>思想</b>2

    C/C++之面向对象编程思想3

    C++作为一门在C和Java之间的语言,其既可以使用C语言中的高效指针,又继承了Java中的面向对象编程思想,在去年
    的头像 发表于 03-30 15:16 380次阅读
    C/<b class='flag-5'>C++</b><b class='flag-5'>之面向</b><b class='flag-5'>对象</b><b class='flag-5'>编程</b><b class='flag-5'>思想</b>3

    PyTorch教程3.2之面向对象的设计实现

    电子发烧友网站提供《PyTorch教程3.2之面向对象的设计实现.pdf》资料免费下载
    发表于 06-05 15:48 0次下载
    PyTorch教程3.2<b class='flag-5'>之面向</b><b class='flag-5'>对象</b>的设计实现