虚函数的限制



虚函数的限制
    一个基类中将所有的成员函数都尽可能地设置为虚函数总是有益的(若该类不是派生类的基类,将成员函数设置为虚函数没有实际意义)。它除了会增加内存开销并无坏处。
    在设置虚函数时必须注意下列事项:
1、只有类的成员函数才能声明为虚函数。这是因为虚函数仅适用于有继承关系的类对象,所以普通函数不能声明为虚函数。
2、静态成员函数不能是虚函数,因为静态成员函数不受限于某个对象。
3、内联函数不能是虚函数,因为内联函数是不能在运行中动态确定其位置的,即使虚函数在类的内部定义,编译时仍然将它视为非内联函数。
4、构造函数不能是虚函数,因为构造时对象还不是占用内存的真正对象,这时,还没办法调用任何成员函数,包括虚函数。只有在构造完成后,对象才能成为一个类的名副其实的实例。
5、析构函数可以是虚函数,而且通常被声明为虚函数。声明虚析构函数的目的在于:使用delete运算符删除一个对象时,能确保析构函数被正确的执行。因为这个时候,采用动态帮的原则,派生类对象自己定义的析构函数就会发生作用。
下面有一个实例:
#include<iostream>
using namespace std;
class A
{
public :
 virtual void disp(int n)
 {
  cout<<"A::disp n="<<n<<endl;
 }
};
class B:public A
{
public :
 void disp(double m)
 {
  cout<<"B::disp m="<<m<<endl;
 }
};

void fn(A &a)
{
 a.disp(5.5);
}

void main()
{
 B b;
 fn(b);
}
//正确结果为5。


//上面这个例子,基类A的函数为虚函数,则存在动态绑定,这样的话,fn(b)应该调用派生类的函数则结果好像为5.5。
//但是相反的是,正确结果为5。
//为什么结果是5而不是5.5呢?这是由于虚函数的参数限制所致。
//一般要求基类中声明了虚函数后,派生类声明的虚函数应该与基类中的虚函数的参数个数相等,对应参数类型一样,
//若不相等则由编译器将派生类的函数的参数类型强制转换为基类中虚函数的参数类型。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值