C++ 基础问题

1. 虚函数

虚函数是在某个基类声明为virtual并在一个或多个派生类中重新定义的成员函数。虚函数是C++多态的基础,通过指向类的指针或引用调用,调用的方式是动态联编,到运行时才确定

调用的是该虚函数的哪一个实现。非虚函数是静态联编,在编译时刻系统就能根据指针类型确定调用的函数。

虚函数一般会有一个默认实现,还有一种函数叫做纯虚函数,纯虚函数可以只声明不定义,带有纯虚函数的类不能实例化,相当于JAVA中的接口。

2. 虚函数的实现

一旦某个类中含有虚函数,编译器会在该类的实例中插入一个指针,指向虚函数表。虚函数表的作用就是保存自己类中虚函数的地址,我们可以将虚函数表看出一个数组,数组中的每一个元素存放的是虚函数的地址,一个虚函数可能会有多种实现,虚函数表中记录的是继承序列中,最接近该子类的那个。被重写的虚函数会在虚函数表中得到更新。

假如某个子类有n个父类,那么他就有n个虚函数表。

3. 虚继承

c++允许多重继承,但多重继承可能会出现菱形继承。菱形继承的问题在于子类调用某个成员变量时会出现歧义。为了解决这个问题,c++基础虚继承的概念,即虚基类的实例只在子类中保存一个实体。这个实体有虚基类的虚函数表和变量,放在子类实例最下面的位置。

4. static, const, extern 的特性

static 的一个特性是隐藏,static修饰的函数或变量在其他文件是不可见的。

static修饰的成员变量和成员函数属于整个类,而独立于类的实例。对于每一个静态成员只存储一份供所有类的实例使用。

const 修饰的变量,默认是隐藏,可通过 extern修饰使得全局可见。编译器通常不为普通 const 常量分配存储空间,而是将他们保持在符号表中,这使它成为编译期间的一个常量,存储不需要内存操作,所以效率比较高。

 

5. malloc free, new delete 的异同

都可以分配,回收空间

new是类型安全的, int *p = new float[2] 能检测出错误。

new 调用构造函数, delete 调用析构函数

malloc 返回指向 void* 类型, 一般需要类型转换

malloc, free, new delete 一般成对使用

 

C++ 基础问题,布布扣,bubuko.com

C++ 基础问题

上一篇:[python] python单元测试经验总结


下一篇:在c++中,静态数据成员可以被非静态成员函数调用吗?如果可以调用的话那为什么还要定义静态成员函数呢