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

    文章

    2966

    浏览量

    104702
  • C++
    C++
    +关注

    关注

    22

    文章

    2108

    浏览量

    73618
  • 面向对象编程

    关注

    0

    文章

    22

    浏览量

    1811
收藏 人收藏

    评论

    相关推荐

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

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

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

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

    C++面向对象多线程编程 (pdf电子版)

    C++面向对象多线程编程共分13章,全面讲解构建多线程架构与增量多线程编程技术。第1章介绍了
    发表于 09-25 09:39 0次下载

    C++课件

     C++面向对象程序设计 面向对象思想的由来面向
    发表于 04-10 13:41 0次下载

    Visual C++面向对象与可视化程序设计习题解析与编程

    Visual C++面向对象与可视化程序设计习题解析与编程实例从最基本的概念出发,详细地讲述了使用Visual C++进行
    发表于 07-12 15:16 0次下载
    Visual <b class='flag-5'>C++</b><b class='flag-5'>面向</b><b class='flag-5'>对象</b>与可视化程序设计习题解析与<b class='flag-5'>编程</b>实

    C++编程思想

    C++编程思想,很好的资料,大家下载看看吧!够20字了吧,哈哈哈!
    发表于 11-17 11:38 0次下载

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

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

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

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

    C++语言和面向对象程序设计教程

    C++语言和面向对象程序设计代表了旨在使计算机问题解更加符合人的思维活动,是软件开发方法的一场革命;面向对象建模和
    发表于 03-02 08:00 6次下载

    STM32 C++编程系列二:STM32 C++代码封装初探

    一、STM32与面向对象编程上一章中提到了,C++的核心之一就在于面向对象
    发表于 12-08 11:06 13次下载
    STM32 <b class='flag-5'>C++</b><b class='flag-5'>编程</b>系列二:STM32 <b class='flag-5'>C++</b>代码封装初探

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

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

    C语言是怎么面向对象编程

    在嵌入式开发中,C/C++语言是使用最普及的,在C++11版本之前,它们的语法是比较相似的,只不过C++提供了面向
    的头像 发表于 02-14 13:57 1661次阅读
    <b class='flag-5'>C</b>语言是怎么<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 574次阅读
    <b class='flag-5'>C</b>/<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 557次阅读
    <b class='flag-5'>C</b>/<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

    浅谈C语言面向对象编程思想

    C语言是一种面向过程的语言,但是也可以用结构体和函数指针来模拟面向对象的特性,比如封装、继承和多态。
    发表于 11-02 12:27 1096次阅读