虚函数使用

来源:互联网 发布:去淘宝上买钢珠犯法吗 编辑:程序博客网 时间:2024/04/28 15:35

 

1、虚函数的使用方法

1】在基类用virtual声明成员函数为虚函数。这样就可以在派生类中重新定义此函数,为它赋予新的功能,并能方便地被调用。
 
2】在派生类中重新定义此函数,要求函数名、函数(返回)类型、函数参数个数和类型与基函数的虚函数相同。如果在派生类中没有对基类的虚函数重定义,则派生类简单地继承直接基类的虚函数。
有一种情况例外,在这种情况下派生类与基类的成员函数返回类型不同,但仍起到虚函数的作用。即基类虚函数返回一个基类指针或基类引用,而子类的虚函数返回一个子类的指针或子类的引用。
class Base{
  public:
    virtual Base *fun(){
      cout<<"Base's fun()."<<endl;
      return this;
    }
};
 
class Derived:public Base{
  public:
    virtual Derived *fun(){
      cout<<"Derived's fun()."<<endl;
      return this;
    }
};
 
void test(Base &x){
  Base *b;
  b=x.fun();
}
 
int main(){
  Base b; 
  Derived d;
  test(b);
  test(d);   
  system("PAUSE");
  return EXIT_SUCCESS;
}
结果:
Base's fun().
Derived's fun().
 
3C++规定,当一个成员函数被声明为虚函数后,其派生类中的同名函数(符合2中定义的函数)都自动成为虚函数。
 
4】定义一个指向基类对象的指针变量,并使其指向同一类族中的某个对象。通过该指针变量调用此函数,此时调用的就是指针变量指向的对象的同名函数。
 
1.3声明虚函数的限制
1】只能用virtual声明类的成员函数,使它成为虚函数,而不能将类外的普通函数声明为虚函数。
 
2】一个成员函数被声明为虚函数后,在同一类族中的类就不能再定义一个非virtual的但与该虚函数具有相同参数(个数与类型)和函数返回值类型的同名函数。
 
3】静态成员函数不能是虚函数,因为静态成员函数不受限于某个对象。
 
4inline函数不能是虚函数,因为inline函数是不能在运行中动态确定其位置的。即使虚函数在类的内部定义,编译时,仍将其视为非inline的。
 
5】使用虚函数,系统要有一定的空间开销。当一个类带有虚函数时,编译器会为该类构造一个虚函数表(virtual function tanle,vtable),它是一个指针数组,存放每个虚函数的入口地址。
以上转自:http://zhangjunhd.blog.51cto.com/113473/57543
2、虚函数有默认形参问题