面试中有关C++的若干问题
By 晴天, 2014.5.16晚
什么是多态?简要说一下C++中的多态的概念。
(1)定义:多态是指相同对象收到不同消息或者不同对象收到相同消息产生不同的行为。
(2)C++中多态分为两种
a) 编译时多态(静态绑定)
通过函数重载来实现
b) 运行时多态(动态绑定)
通过虚函数来实现
(3)它与这几关键词联系在一起
动态绑定 virtual关键字/虚函数 函数重载 虚函数表
只有基类用virtual修饰的函数才有可能实现多态。跟派生类用不用virtual修饰没有关系。
我的感受
多态:给定哪个对象(内存中的真实存在的对象)调用的就是这个对象的方法,与怎么调用的没关系,哪怕把这个对象的指针转换成基类或其他派生类的指针,都不影响,这恰恰是多态需要保证的性质。
其他相关的
面向对象的四大性质
(1)抽象
(2)封装--可以使代码模块化
(3)继承--可以复用/扩展已存在的代码
(4)多态--为了接口重用,注: (2)(3)都是为了代码重用
函数覆盖--指派生类重新定义基类的方法 override
函数隐藏--指派生类的函数屏蔽了与其同名的基类函数
重载和重写是同一个意思 (override,overwrite)有时也称为函数覆盖,
派生类可以重载成员函数,只有重载父类定义的虚函数才能构成多态。
纯虚函数 与 抽象类
引入纯虚函数的目的,一是为了不让不合理的基类实例化,二是强制派生类实现纯虚函数
做法,就是让函数声明后面加上"=0"
参考
[1] http://blog.csdn.net/hackbuteer1/article/details/7475622
待补充
什么是动态绑定,怎么实现的?涉及到多重继承是怎么样的?
待完成
C++中指针和数组的区别(准确表达是数组名和指针的区别)
关于数组:
(1)数组名它相当于一个指针常量,但它实际是指代数组这种数据结构;
(2)能通过sizeof来求得数组所占内存的大小,也能求得数组的长度(多维数组同样能求得每一维的长度);
(3)数组是通过数组名的地址+偏移量来获取元素;
(4)通过函数调用时,将数组作为参数,那么数组会退化成指针。
关于指针:
(1)指针它就是一个固定大小的变量,通常是4个字节,它是用来存储地址的,间接访问数据或函数;
(2)指针可以进行自增(自减)运算(void指针除外,因为不知道步长)。
更具体一点,指针和数组访问的区别?
数组是通过数组名的地址+偏移量来获取元素,数组名是编译时就知道它的地址的,直接获取元素;
指针是先获取指针变量里的地址,(这个地址是在运行时才能确定,有可能是无效的),然后再获取该地址的内容。
容易忽略的地方
注意声明和定义的区别,定义是为一个变量或者对象分配内存空间,而声明只是描述类型
关于数组char a[5], a与&a是不同的,不是说得到的地址不同,而是说有不同的含义(a+1与&a+1结果是不同的)。
参考:
[1] http://www.cnblogs.com/dolphin0520/archive/2011/11/09/2242138.html
[2] http://see.xidian.edu.cn/cpp/html/475.html
C++中new的过程是怎么样的?
待完成