程序员面试宝典——面向对象总结

简介: 1 structure和class的区别? structure和class的唯一区别就是默认的访问控制不同,structure默认是public,class默认是Private;structure也可以有构造函数、析构函数、成员函数等。

1 structure和class的区别?

structure和class的唯一区别就是默认的访问控制不同,structure默认是public,class默认是Private;structure也可以有构造函数、析构函数、成员函数等。

 

2 继承体系中为什么将析构函数声明为虚函数?

当你可能通过基类指针删除派生类对象时,建议使用虚析构函数。这样保证在删除一个执行派生类的基类指针时,不会出现只删除了基类部分,而没有删除派生类部分而导致内存泄露。

 

3 析构函数可以为virtual型,构造函数则不能。那么为什么构造函数不能为虚呢?

1)从存储的角度看,虚函数对应一个执行vtable虚函数表的指针,都知道,这个指向vtable的指针其实是存储在对象的内存空间的。问题出来了,如果构造函数是虚的,就需要通过vtable来调用,可是对象还没有实例化,也就是内存空间还没有,怎么找vtable呢?所以构造函数不能是虚函数。

2)虚函数采用一种虚调用的办法。徐调用是一种可以在只有部分信息的情况下工作的机制,特别允许我们调用一个只知道接口而不知道其准备对象类型的函数。但是如果要创建一个对象,你势必要知道对象的准确类型,因此构造函数不能为虚。

 

3 为什么不把每个函数都声明为虚函数?

这是因为虚函数是有代价的:由于每个虚函数的对象必须维护一个指向虚函数表的指针,因此在使用虚函数的时候会产生一个系统开销。如果仅是一个很小的类,且不想派生其他类,那么根本没有必要使用虚函数。 

 

4 什么是多态?

多态性可以简单地概况成一句话“一个接口,多个方法“,在程序运行过程中才决定调用的函数。多态性是面向对象编程领域的核心概念。多态是通过虚函数实现的。

虚函数就是允许被其子类重新定义的成员函数。而子类重新定义父类虚函数的做法,称为”覆盖“,或者称为”重写“。覆盖是指子类重新定义父类的虚函数的做法。而重组,是指允许存在多个同名函数,而这些函数的参数表不同(或者参数个数不同,或者参数类型不同,或者两者都不同)。其实,重载的概念并不属于”面向对象编程“。重载的实现是:编译器根据函数不同的参数表,对同名函数的名称做修饰,然后这些同名函数就成了不同的函数(至少对编译器来说是这样的)。它们的地址在编译期就绑定了,是静态的,因此,重载与多态无关。真正与多态相关的是”覆盖“。当子类重新定义了父类的虚函数后,父类指针根据赋给它的不同的子类指针,动态地调用属于子类的该函数,这样的函数调用在编译期间是如法确定的。因此,函数是在运行期绑定的。结论是:重载只是一种语言特性,与多态无关,与面向对象也无关!

 

封装可以隐藏实现细节,使得代码模块化;继承可以扩展已存在的代码模块(类),它们的目的都是为了代码重用。而多态则是为了实现另一个目的——接口重用!

 

5 重载和覆盖有什么不同?

虚函数总是在派生类中被改写,这种改写被称为”override“(覆盖)。

override是指派生类重写基类的虚函数。重写的函数必须有一致的参数表和返回值。

overload是”重载“,是指编写一个与已有函数同名但是参数表不同的函数。重载不是一种面向对象的编程,而只是一种语法规则,重载与多态没有什么直接关系。

 

相关文章
|
3月前
|
存储 算法 程序员
【Leetcode 程序员面试金典 01.01】判定字符是否唯一 —— 位运算|哈希表
可以使用哈希表或位运算来解决此问题:由题可知s[i]仅包含小写字母,int[26]即能表示字符的出现次数;
|
3月前
|
算法 程序员 索引
【Leetcode 程序员面试金典 02.08】 —— 环路检测 |双指针
我们可以使用双指针解决本题,由数学推导可知:a 的距离为(环长度的倍数 - b),即 tmp 指针从头节点走到环开头节点等于 slow 指针走到环开头节点的距离
|
3月前
|
Java 程序员
【Leetcode 程序员面试金典 05.01】插入 —— 位运算
位运算问题,只需要把 N 的 i 到 j 位都置 0 后再和 M 左移 i 位的结果进行按位或即可
|
3月前
|
算法 架构师 安全
10年Java面试总结:Java程序员面试必备的面试技巧
作为一名资深10年Java技术专家,我参与了无数次的面试,无论是作为面试者还是面试官。在这里,我将分享我的一些面试经历和面试技巧,希望能帮助即将面临面试的Java程序员们。回顾我的Java职业生涯,我清晰地记得一次特别的面试经历。那是我申请一家知名科技公司的Java开发岗位。为了这次面试,我花了几周的时间准备,这不仅包括Java的基础和高级知识,还有关于公司产品的研究。
145 0
|
1月前
|
存储 开发框架 安全
C# .NET面试系列二:面向对象
<h2>面向对象 #### 1. 什么是构造函数? 构造函数(Constructor)是一种特殊类型的方法,它在创建类的实例(对象)时被调用,用于初始化对象的状态。构造函数的名称必须与包含它的类的名称相同,并且没有返回类型。 主要特点和用途包括: 初始化对象: ```c# 构造函数主要用于初始化类的实例。当使用 new 关键字创建类的对象时,构造函数会被调用,确保对象在使用之前处于一个合适的状态。 ``` 与类同名: ``` 构造函数的名称必须与包含它的类的名称完全相同。 ``` 没有返回类型: ```c# 构造函数没有返回类型,甚至不能声明 void。它的目的是初始化对象
48 0
|
2月前
|
运维 算法 程序员
程序员去国企:长城资产IT岗位秋招面试记录
【2月更文挑战第7天】本文介绍2024届秋招中,中国长城资产管理股份有限公司的信息技术岗岗位一面的面试基本情况、提问问题等~
|
3月前
|
C++
面试题:讲讲面向对象
面试题:讲讲面向对象
24 0
|
3月前
|
SQL 缓存 Java
程序员的30大Mybatis面试问题及答案
程序员的30大Mybatis面试问题及答案
|
26天前
|
Java 程序员
java线程池讲解面试
java线程池讲解面试
49 1
|
2月前
|
存储 关系型数据库 MySQL
2024年Java秋招面试必看的 | MySQL调优面试题
随着系统用户量的不断增加,MySQL 索引的重要性不言而喻,对于后端工程师,只有在了解索引及其优化的规则,并应用于实际工作中后,才能不断的提升系统性能,开发出高性能、高并发和高可用的系统。 今天小编首先会跟大家分享一下MySQL 索引中的各种概念,然后介绍优化索引的若干条规则,最后利用这些规则,针对面试中常考的知识点,做详细的实例分析。
246 0
2024年Java秋招面试必看的 | MySQL调优面试题