什么函数不能声明为虚函数??
一个类中将所有的成员函数都尽量地设置为虚函数都是有益的,但是设置虚函数需要注意以下方面:
-
只有类的成员函数才可以设置为虚函数。
-
静态成员函数不能设置为虚函数。(因为调用静态成员函数不需要实例,但调用虚函数需要从一个实例中指向虚函数表的指针来得到函数的地址,因此调用虚函数需要实例,两者矛盾)
-
内联函数不能为虚函数。
-
构造函数不能为虚函数。(创建派生类的对象是将调用派生类的构造函数,而不是基类的构造函数,然后派生类的构造函数使用基类的一个构造函数,这种顺序不用于继承机制。因此派生类不继承基类的构造函数,所以将类构造函数声明为虚没有意义。)
-
析构函数可以为虚函数,而且通常声明为虚函数。
-
友元不能是虚函数。因为友元函数不是成员函数,而只有成员函数才能是虚函数。
是否可以把每一个函数都声明为虚函数:
虽然虚函数很有效,但不能够把每一个 成员函数设置为虚函数。因为使用虚函数是要付出代价的,在内存和执行速度方面有一定的成本:
- 每个对象都将增大,增大量为存储地址的空间;
- 对于每个类,编译器都创建一个虚函数地址表(数组);
- 对于每个函数调用,都需要执行一项额外的操作,即到表中查询地址。