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().
【3】C++规定,当一个成员函数被声明为虚函数后,其派生类中的同名函数(符合2中定义的函数)都自动成为虚函数。
【4】定义一个指向基类对象的指针变量,并使其指向同一类族中的某个对象。通过该指针变量调用此函数,此时调用的就是指针变量指向的对象的同名函数。
1.3声明虚函数的限制
【1】只能用virtual声明类的成员函数,使它成为虚函数,而不能将类外的普通函数声明为虚函数。
【2】一个成员函数被声明为虚函数后,在同一类族中的类就不能再定义一个非virtual的但与该虚函数具有相同参数(个数与类型)和函数返回值类型的同名函数。
【3】静态成员函数不能是虚函数,因为静态成员函数不受限于某个对象。
【4】inline函数不能是虚函数,因为inline函数是不能在运行中动态确定其位置的。即使虚函数在类的内部定义,编译时,仍将其视为非inline的。
【5】使用虚函数,系统要有一定的空间开销。当一个类带有虚函数时,编译器会为该类构造一个虚函数表(virtual function tanle,vtable),它是一个指针数组,存放每个虚函数的入口地址。
以上转自:http://zhangjunhd.blog.51cto.com/113473/57543
2、虚函数有默认形参问题
class base
{
public:
virtual void g(float x = 2.0f)
{
cout << "Base::g(float) " << x << endl;
}
};
class derived : public base
{
public:
void g(float x = 1.0f)
{
cout << "Derived::g(float) " << x<< endl;
}
};
int main()
{
base *b = new derived;
b->g();
delete b;
}
//结果为:Derived::g(float) 2
//而不是:Derived::g(float) 1
//结果调用了子类的虚函数g,但却使用了基类的默认形参2.不解,望高手指
//点
本文来自优快云博客,转载请标明出处:http://blog.youkuaiyun.com/leegongbo/archive/2009/06/16/4274480.aspx