1,如果派生类和基类有相同名字的变量,派生类会覆盖基类的变量吗?
class A { int i; };
class B : public class A { int i; };
不会覆盖,只会隐藏,sizeof(A) = 4, sizeof(B) = 8可以证明这一点,隐藏的意思是说通过派生类的对象或指针无法访问基类的变量,实际上,编译器可能会对类的member加上class名称,形成独一无二的命名,这个过程叫做name-mangling, 处理后class B变成:
class B { int i1A; int i1B; } ;
2.为什么static member function不能用const修饰
static void foo() const {} //Error
我们都知道,const函数不能改变对象,那么它是怎样做到这一点的呢?答案是用const修饰this指针,内部转化过程:
void foo() const { } ----------------->void foo(const this) { }, 然而static函数没有this指针,所以也就没必要用const声明了。
3.一句话总结派生类如何利用基类:
我有的东西绝不跟你要,我没有的东西一定跟你要,如果你也没有,就算了。
4.哪些函数是虚函数(virtual function)?
(1).使用virtual关键字声明的: class A { virtual void foo() {} }; 这样的函数是virtual function
(2).从基类继承而来的,且重写(overrided)了:
class A { virtual void foo() {} }; class B : public class A { void foo() {} };
我们说Class B的foo()函数也是virtual function
(3).从基类继承而来的,没有重写:
class A { virtual void foo() {} }; class B : public class A { };
虽然class B没有foo()的定义,但class B有一个virtual function,那就是A::foo(),因为它是从class A继承而来的。
(4)基类的destructor是virtual的
class A { virtual ~A() {} }; class B : public class A { ~B() {} };
我们说class B的destructor也是virtual function
对于所有上述virtual function,编译器都会把它们的首地址保存在一个Virtual Table里面。
注意构造函数不
能是virtual functjion,从实现上来说,调用virtual
function需要保证设置好vptr,而调用造函数时这个vptr根本还没初始化,也就不能使用,所以不能把构造函数声明为virtual.
从实际意义来说,调用构造函数意味着想要创建一个类的对象,这个类是确定的,所以它所调用的构造函数也是确定的,故没必要把构造函数变为virtual。
4。满足哪些条件才会重载(overrid)基类的函数
C++标准规定,只有函数名,参数列,返回值类型都相同,才会重写,下列函数都会重载:
void func()-------void func()
virtual void func() ------void func()
void func() ---------virtual func()
virtuan void func() --------virtual void func()
注意这里的返回值支持多态,也就是如果class Derived : public Base那么这个函数也会重写
Base *clone() ---------Derived *clone()
5.以下两个函数有什么区别?
int k = 5;
int *j = k;
void func1( int * i) {}
void func2( int * & i) {}
本质上,两个函数的实参都是一个变量的地址,但有一点微小的却别。
func1的形参类型为int *,那么实参可以为指针变量,也可以为int变量的地址,所以有两种调用方式:
func1( &k );
func1( j );
func2的形参为指针的引用,那么实参必须是指针变量,所以只能这样调用:
func2( j )
6。友元函数的作用是什么?
大多数时候都会把类的data members声明为protected,这样的封装符合面向对象的设计原则,但有些时候我们会很想访问一个对象的protected成员,可以在类里面插入一个友元函数,把它的参数设为类的引用,然后在类的外面定义它,通过参数--对象的引用来访问protected成员。
7. 基类的虚析构函数的作用是什么?
阻止基类被实例化,如果基类有其它的virtual function,则虚析构函数就没必要,但如果基类没有其他的virtual function,则虚析构函数就很有必要了。
分享到:
相关推荐
基本C++学习Essential C++Effective C++C++沉思录中面向对象的部分
c++沉思录的21章代码 没有下载的,只是书上有些分散的代码片段,我录入了一下,供需要的人下载使用,节省时间
c++沉思录.pdf c++学习的必备数据,
内容索引:VC/C++源码,随书源码,随书源码 C++ 沉思录随书实例源代码,运行于C++环境,都是些小程序,C++打基础的用户学习学习。
《C++沉思录》--十年编程生涯的真知灼见
学习C++的一本好书~!C++沉思录~!学习C的必备书之一~
《C++沉思录》第八章 “一个面向对象程序的范例”
#include <stdio.h>class Trace{public:Trace(){noisy=0;f=stdout;}Trace(FILE*ff){noisy=0;f=ff;}void print(char*s){if (noisy)fprintf(f,"%s",s);}void on(){noisy=1;}void off(){noisy=0;}private:int noisy;...
本书适合有一定经验的c++程序员阅读学习,可以帮助你加强提高技术能力,成为c++程序设计的高手
经典书籍值得珍藏留着 以后慢慢用
关于C++的一本很好的书!!对C++进行深入的思考!!希望能帮到大家!!
C\C++编程开发PDF[15本].rar C Primer Plus 5th C Primer_Plus C++ Primer Plus 6th ...C++ 沉思录 C++ 程序设计原理与实践 C++ 高级编程_本地没有找到 C++ 语言99个常见编程错误 C++ 语言的设计和演化
C++沉思/C++编程思想, 两本很经典的图书
c++沉思录.pdf; Effective_STL.chm; effectiveC++.chm; Thinking in C++ 中文版.pdf; 标准C++输入输出流与本地化.pdf; 泛型编程与STL.pdf; 美河提供.STL.源码剖析.pdf; 高质量C++C编程指南.pdf; 计算机算法...
散文集 1 source 1 ss vc 1 入门 2 1 面试题 1 delphi 1 java 1 经典 1 基础 1 全集 1 windows 2 1 管理 1 设计 1 数据库 1 数据结构 1 1800例 1 电子书 1 c++沉思录 1 答案 1 server 1 sql 1 edition 1 3rd 1 ...
C++编程惯用法——高级程序员常用方法和技巧 C++沉思录 C++数值算法(第二版) C高级编程技术
改善程序技术与设计思维的55个有效做法(第三版)(中文版)C++ 编程思想More Effective C++中文版Exceptional C++中文版More Exceptional C++中文版Exceptional C++ Style中文版深度探索C++对象模型C++沉思录
C++ Primer_3rd_CN,C++沉思录,C++的两本非常不错的教程贡献给大家共同学习,交流 如果侵犯版权,请删除。 qq: 3314 92854
徐士良著的C常用算法程序集 C++沉思录 VC++编程指南
理解了这道题,你的C++才合格, C++沉思录中的一道好题,考验你设计和模式的应用能力