C++或Java、C#等面向对象语言基础面试题

文章目录

  • 前言
  • 一、面向对象三大特性是什么?
  • 二、封装
  • 三、继承
  • 四、多态
  • 总结

前言

计算机语言的发展经历了机器语言、面向过程语言、以及面向对象语言,机器语言晦涩难懂高效,代表语言是汇编语言,面向过程语言代表C语言,面向对象语言代表C++和Java。由于在计算机发展早期,硬件设备极其有限,效率往往是第一要素,汇编语言语言以及后来的C语言就作为软件开发必修内容,但是随着硬件和计算机语言发展到今天,一个以对象管理为概念语言就孕育而生。

C++语言以及后来的Java语言就流行起来,面向对象语言的理解以正常社会个体来理解程序语言本身,符合人的正常思考思维和人性思维,同时对于大系统以及架构维护比先前的面向过程语言容易许多。

        在理解面向对象语言时,对于面向对象语言三大特性是什么就比较重要。


一、面向对象(OOP)三大特性

1)封装、继承、多态


二、封装

对象的属性(成员变量)和操作或服务(函数)结合为一个独立的整体,并尽可能隐藏对象的内部实现细节。类(class)就是封装的总体体现, public、protect、private成员属性的访问权限让开发者设定哪些细节可以暴露,哪些需要隐藏。    我们定义Person类,如下:

class Person

{

private int age;

private string name;

public void setAge(int age)

{

this.age = age;

}

public int getAge()

{

return age;

}

public void setName(string name)

{

this.name = name;

}

public string getName()

{

return name;

}

}

对于 Person类有两个成员变量,age 和 name ,我们不需要直接对他进行访问,更改需要使用setAge接口,访问需要getAge(),这样保证数据的隐秘性成员变量不直接暴露。当然我们也可以定义 public int age,但是这不符合封装性的设计思想。

如何体现封装性:

       1)类(class)

                体现了封装性的完整性

       2)通过public,protect、private访问权限修饰

                它们控制想要访问的细节,哪些接口和成员变量需要被影藏,修改成员变量的接 

                口 setxxx()进行修改,getxxx()进行访问

       3)良好的接口设计

                应该只关注传入参数和返回值以及其作用,并不需要关注过多细节。


三、继承

一个类可以派生自多个类,这意味着,它可以从多个基类继承数据和函数。定义一个派生类,我们使用一个类派生列表来指定基类

class Base Character

{

private int hp;

private int mp;

public void setHp(int hp)

{

this.hp = hp;

}

public int getHp()

{

return hp;

}

public void setMp(int mp)

{

this.mp = mp;

}

public int getMp()

{

return mp;

}

}

class Hero public BaseCharacter

{

        //当前任务ID

private int currentTaskId;

public void setCurrentTaskId(int id)

{

this.currentTaskId = id;

}

public int getCurrentTaskId()

{

return this.currentTaskId;

}

        省略 ...

}

BaseCharater* p = new Hero();

hero类继承BaseCharacter类,hero和BaseCharacter都有hp和mp,这样hero就必重写,同时实现了代码设计的统一,可以通过统一接口i通过基类访问派生类,同时派生类有着基类所有属性。派生类是基类的扩展,基类的私有成员变量也会被派生类继承,只不过派生类不能访问罢了。

继承让代码更简洁,但是继承往往打破的封装性,程序设计往往追求高内聚、低耦合,继承是一种高耦合的设计,所以在代码设计时需要做出取舍。


四、多态

多态按字面的意思就是多种形态。当类之间存在层次结构,并且类之间是通过继承关联时,就会用到多态。C++ 多态意味着调用成员函数时,会根据调用函数的对象的类型来执行不同的函数。

多态体现:

 多态最直接的体现virtual 虚函数和纯虚函数

如下有:战斗角色类FightCharacter,它的子类都有attack攻击行为,但是attack攻击行为做执行的细节有很大的不同。我们定义为纯虚函数

同时有每帧更新行为,子类可能与父类的更新内容一样,也可能不一样,所以我们把他定义为虚函数,

class FightCharacter public BaseCharacter

{

//攻击行为

public  virtual void  attack(int destId)=0;

public virtual void update()

{

                省略 ...

}

}

class Hero public FightCharacter

{

          省略 ...

//英雄攻击时有自己的逻辑

public override void attack(int destId)

{

  省略 ...

}

public override  void update()

{

                省略 ...

}

        省略 ...

}

class Monster public FightCharacter

{

          省略 ...

//怪物攻击时有自己的逻辑

public override void attack(int destId)

{

  省略 ...

}

public override  void update()

{

                省略 ...

}

        省略 ...

}

FightCharacter* pHero = new Hero();

FightCharacter* pMonster = new Monster ();

pHero->attack(); //调用的是pHero实际指向对象所定义的类的attack函数

pHero->update();//调用的是pHero实际指向对象所定义的类的update函数

pMonster->attack();//调用的是pMonster实际指向对象所定义的类的attack函数

pMonster->update();//调用的是pMonster实际指向对象所定义的类的update函数

在什么时候定义虚函数,在什么时候定义纯虚函数 

如果子类都有某一行为,但是各个子类行为实现细节没有统一性,那么就定义纯虚函数

如果子类中都有某一行为,但是各个子类有些许差异,这时候应该定义为虚函数。


总结

面向对象的三大特性:封装、继承、多态

封装的体现:类和public、protect、private 访问权限,良好的接口设计

继承:通过派生子类,来复用父类的属性和成员,提高代码的复用率与代码简洁、易维护,继承是高耦合设计,打破封装性,要有选择性使用,把握分寸。

多态的体现:虚函数与纯虚函数

基础面试题: 面向对象三大特性相关推荐

  1. 夯实Java基础系列1:Java面向对象三大特性(基础篇)

    本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial 喜欢的话麻烦点下 ...

  2. [.net 面向对象编程基础] (13) 面向对象三大特性——多态

    [.net 面向对象编程基础] (13) 面向对象三大特性--多态 前面两节,我们了解了面向对象的的封装和继承特性,面向对象还有一大特性就是多态.比起前面的封装和继承,多态这个概念不是那么好理解.我们 ...

  3. 大数据必学Java基础(四十):面向对象三大特性之一继承(Inheritance)

    文章目录 面向对象三大特性之一继承(Inheritance) 一.列举案例说明 1.类是对对象的抽象

  4. 大数据必学Java基础(三十九):面向对象三大特性之一封装(Encapsulation)

    文章目录 面向对象三大特性之一封装(Encapsulation) 一.生活案例 二.Java中封装的理解

  5. 【Python面试】 说说Python面向对象三大特性?

    往期面试题: 谈谈对 Python 和其他语言的区别? 说说 Python 解释器种类以及特点? 说说4种常用编码的区别? 废话不多说,开始今天的题目: 问:说说Python面向对象三大特性? 答:P ...

  6. C#面向对象三大特性

    C#面向对象三大特性 面向对象的三个基本特征是:封装.继承.多态. 封装:隐藏内部功能的具体实现,只保留和外部交流数据的借口.就好比电视机,用一个外壳把内部零部件及控制电路封装起来,只提供按钮或者遥控 ...

  7. 2.1.1 Python面向对象三大特性

    点击跳转Python笔记总目录 Python面向对象三大特性 1,继承 1,继承和组合 组合 继承 2,封装 2.0 私有变量和私有方法 2.1 封装与扩展性 2.2 property属性 2.3 c ...

  8. python面向对象——三大特性

    python面向对象--三大特性 1. 引言 Python是面向对象的语言,自然也支持面向对象的三大特性:封装.继承.多态. 因为Python2已经较为古老,所有除非是阐述区别,大部分情况下Pytho ...

  9. 【Python学习笔记】面向对象三大特性

    2019独角兽企业重金招聘Python工程师标准>>> ★面向对象:封装.继承和多态是面向对象的三大特点★ 面向对象编程简称OOP,是一种程序设计思想.OOP把对象作为程序的基本单元 ...

最新文章

  1. table的分页打印
  2. 服务器flask远程访问_在Flask中使用什么API来检查远程(其他)服务器的连接?...
  3. MySQL数据库:事务和ACID实现原理
  4. c语言课后答案第八章,C++第一至第八章课后习题答案
  5. 如何使用 mock 数据在本地运行 SAP Fiori Elements
  6. 北理工计算机学院新闻,北理工计算机学子勇夺CVPR 2021 AI安全国际顶级赛事季军...
  7. python logging模块简单使用
  8. leetcode isPalindrome (回文数判断)
  9. ArcGIS TIN地表面与栅格地表面的生成与互相转换
  10. 人工智能或可称之为人造智能
  11. Jquery一款非好的图片轮换效果
  12. 阿里云刘伟光:核心系统转型之路
  13. C语言 数据结构 实验二 线性表的链式存储及其操作
  14. 万能五笔输入法下载|万能五笔输入法电脑版下载
  15. 【Bug解决】yum提示Another app is currently holding the yum lock; waiting for it to exit...
  16. 软考中级网络工程师学习笔记(知识点汇总)详细版本
  17. 删除文件夹需要管理员权限的解决方法
  18. 数据分析 第二章 1.数据清洗及特征处理
  19. 深入Python 验证码解析
  20. 如何把可爱的Live2d看板娘放到自己的网页上

热门文章

  1. 计算机专业不用amd,家用电脑CPU用英特尔还是AMD?为什么这么多人不用英特尔?...
  2. VS2017如何显示新建网站选项
  3. Java 字节数组流之图片转成字节数组
  4. Harmattan:一款时尚的Linux桌面伴侣
  5. 利用分析函数和开窗函数进行分组查询
  6. 偶是个女程序员,能不能转行,转行了能做什么呢?
  7. Matlab parfor函数详解
  8. 用Python读取考勤机卡式报表并处理成常规的行式报表格式
  9. 两万字总结python之pandas库
  10. maya餐具图片_MAYA动画场景制作