在使用C++的过程中,运用继承来扩展基础类的时候,会不会产生额外的开销呢?会的。这是因为构造函数机制的问题。C++会机械的从顶层的基础类开始,逐级调用构造函数来初始化派生类对象。大多数情况下,这种机制正是所需要的。但是,如果初始化只需要清0呢?这样一级一级逐步清0是不是太低效了?低效,又是强制性调用,这是C++最被诟病的地方,毕竟用过C的程序员都知道,在C里面,只需要调用一个memset()就可以了。而C++程序员谁没有用过C呢?
那么构造函数能不能像虚拟析构函数那样,跳过基础类的构造函数,直接调用派生类的构造函数呢?答案是不可以!不过… …
#include <stdio.h>
#include <string.h>
class Base {
protected: Base(){}
public:
Base(int){i=5; j=7;}
int i;
int j;
};
class A :public Base {
public:
A(int n):Base(0), n(n) {}
A(): Base() { memset(this, 0, sizeof(A)); }
int n;
};
int main()
{
A a;
printf("i,j,n = %d,%d,%d\n", a.i, a.j,a.n);
}
来看这段代码。基础类用了一个重载的受保护的空的构造函数。派生类的构造函数用这个空构造函数来“初始化”基类,实际上是走走形式,什么也没做。然后用memset()来总清。程序编译之后,空的构造函数被优化掉,从而只调用派生类的memset()。这样就避开了低效的初始化链的问题。复制构造函数和赋值也可如法炮制。