2020年最全面的C++复习大纲!面向对象程序设计,建议收藏( 七 )


2020年最全面的C++复习大纲!面向对象程序设计,建议收藏文章插图
40.父类成员中的public、protected、private成员 , 哪些在子类中是可以访问的?
在公有继承、私有继承、受保护继承三种继承方式下 , 父类成员中的public、protected、private成员被继承到子类后 , 其可访问性分别是什么?
派生类是否可以继承父类的构造函数和析构函数?
public 和protected是可以访问的 , private不可访问 。
公有继承:public、protected、private
私有继承:private、private、private
保护继承:protected、protected、private
派生类不能继承父类的构造函数和析构函数 。
41.多重继承会带来什么问题?在C++中是如何解决的?
问题1:类DC的对象中存在多个同名成员 x ,应如何使用?
问题2:类DC的对象中 , 存在两份来自类BC0的成员K , 如何区分?
解决方案:
在BC1类和BC2类继承BC0时 , 其前面加上virtual关键字就可以实现虚拟继承 , 使用虚拟继承后 , 当系统碰到多重继承的时候就会先自动加一个BC0的拷贝 , 当再次请求一个BC0的拷贝时就会被忽略 , 以保证继承类成员函数的唯一性 。
2020年最全面的C++复习大纲!面向对象程序设计,建议收藏文章插图
42.对于函数调用 , 什么是前期绑定(Early Binding , 又称为静态联编)?什么是的后期绑定(Late Binding , 又称为动态联编)?重载函数是后期绑定吗 , 如果不是为什么?
绑定:程序自身彼此关联的过程 , 确定程序中的操作调用与执行该操作的代码间的关系 。 例如把一个标示符名和一个存储地址联系在一起的过程 。
用面向对象的术语讲 , 就是把一条消息和一个对象的方法相结合的过程 。
按照绑定进行的阶段的不同 , 可以分为静态绑定和动态绑定两种 。
静态绑定:绑定工作在编译连接阶段完成 。
因为绑定过程是在程序开始执行之前进行的 , 因此也称为早期绑定或前绑定 。
在编译、连接过程中 , 系统就可以根据类型匹配等特征确定程序中操作调用与执行该操作代码的关系 , 即确定了某一个同名标识到底是要调用哪一段程序代码 。
动态绑定:和静态绑定相对应 , 绑定工作在程序运行阶段完成的 。
2020年最全面的C++复习大纲!面向对象程序设计,建议收藏文章插图
pa->Get( ) 调用的是 A::Get( )还是B::Get( ) , 编译时无法确定 , 因为不知道MyFunction被调用时 , 形参会对应于一个 A 对象还是B对象 。
所以只能等程序运行到 pa->Get( )了 , 才能决定到底调用哪个Get( ) 。
重载函数是静态绑定 。
43.要让一个函数调用表现出多态特征 , 必须满足哪些条件?
a.必须存在继承关系;
b.子类重写父类的方法 。 继承关系中必须有同名的虚函数 , 并且它们是覆盖关系(重载不行) 。
c.存在基类的指针 , 通过该指针调用虚函数 。
44.简述虚函数动态绑定的实现原理 。
构造函数中为对象的虚指针赋值 , 通过多态类型的指针或引用调用成员函数时 , 通过虚指针找到虚表 , 进而找到所调用的虚函数的入口地址 , 通过该入口地址调用虚函数 。
45.什么是隐藏(hiding)、覆盖(overriding)、重载(overloading)?对比它们的异同?以C++代码为例进行说明 。
若基类 B 定义了非虚方法 m , 同时其派生类 D 也定义了方法m , 此时 , 我们说派生类方法 D::m 隐藏了继承自基类的同名方法 B::m。 由于函数签名不同 , 所以二者不构成重置 。 故D::m隐藏了B::m 。
2020年最全面的C++复习大纲!面向对象程序设计,建议收藏文章插图
覆盖(override)是指派生类中存在重新定义的函数 , 其函数名、参数列、返回值类型必须同父类中的相对应被覆盖的函数严格一致 , 覆盖函数和被覆盖函数只有函数体不同 , 当派生类对象调用派生类中该同名函数时会自动调用派生类中的覆盖版本 , 而不是父类中的被覆盖函数版本 , 这种机制就叫做覆盖 。
2020年最全面的C++复习大纲!面向对象程序设计,建议收藏文章插图
重载:如果顶层函数有不同的签名 , 则函数名可以相同 。
2020年最全面的C++复习大纲!面向对象程序设计,建议收藏文章插图
如果同一类中的函数有不同的签名 , 则函数名可以相同 。
2020年最全面的C++复习大纲!面向对象程序设计,建议收藏文章插图
编译过程中绑定函数调用和对应的函数体
46.什么是多态?
一个组合的希腊词 。 含义:一种物质有多种形态 。 在专业术语中 , 多态是一种运行时绑定机制(run-time binding), 通过这种机制 , 实现将函数名绑定到函数具体实现代码的目的 。