前言
C++作为一门在C和Java之间的语言,其既可以使用C语言中的高效指针,又继承了Java中的面向对象编程思想,在去年编程语言排行榜上更是首次超过Java,进入前三。
今天这篇文章就来讲解下C++中的 面向对象编程思想 。说到面向对象编程,就要讲到对象的三大特性: 封装,继承和多态 。本篇文章就以这三个特性展开。
目录
封装
封装是面向对象编程三大特性之一。
核心思想1 :将属性和行为作为一个整体来表现生活中的事物。
class People {
public:
string name;
void eat();
private:
string 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 A:public 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++
+关注
关注
22文章
2108浏览量
73618 -
面向对象编程
+关注
关注
0文章
22浏览量
1811
发布评论请先 登录
相关推荐
评论