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

电子说

1.2w人已加入

描述

前言

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

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

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分