自己网站服务器,甘肃省崇信县门户网,网站footer设计,汉川做网站什么是虚函数
在类的定义中#xff0c;前面有 virtual 关键字的成员函数称为虚函数#xff1b;virtual 关键字只用在类定义里的函数声明中#xff0c;写函数体时不用。
class Base
{virtual int Fun() ; // 虚函数
};int Base::Fun() // virtual 字段不用在函数体时定义
…什么是虚函数
在类的定义中前面有 virtual 关键字的成员函数称为虚函数virtual 关键字只用在类定义里的函数声明中写函数体时不用。
class Base
{virtual int Fun() ; // 虚函数
};int Base::Fun() // virtual 字段不用在函数体时定义
{ }
多态实现一
「派生类的指针」可以赋给「基类指针」通过基类指针调用基类和派生类中的同名「虚函数」时:
若该指针指向一个基类的对象那么被调用是 基类的虚函数若该指针指向一个派生类的对象那么被调用 的是派生类的虚函数。
这种机制就叫做“多态”说白点就是调用哪个虚函数取决于指针对象指向哪种类型的对象。 // 基类
class CFather
{
public:virtual void Fun() { } // 虚函数
};// 派生类
class CSon : public CFather
{
public :virtual void Fun() { }
};int main()
{CSon son;CFather *p son;p-Fun(); //调用哪个虚函数取决于 p 指向哪种类型的对象return 0;
}
多态实现二
派生类的对象可以赋给基类「引用」通过基类引用调用基类和派生类中的同名「虚函数」时:
若该引用引用的是一个基类的对象那么被调 用是基类的虚函数若该引用引用的是一个派生类的对象那么被 调用的是派生类的虚函数。
这种机制也叫做“多态”说白点就是调用哪个虚函数取决于引用的对象是哪种类型的对象。
// 基类
class CFather
{
public:virtual void Fun() { } // 虚函数
};// 派生类
class CSon : public CFather
{
public :virtual void Fun() { }
};int main()
{CSon son;CFather r son;r.Fun(); //调用哪个虚函数取决于 r 引用哪种类型的对象return 0;
}
} 示例一
class A
{
public :virtual void Print() { cout A::Printendl ; }
};// 继承A类
class B: public A
{
public :virtual void Print() { cout B::Print endl; }
};// 继承A类
class D: public A
{
public:virtual void Print() { cout D::Print endl ; }
};// 继承B类
class E: public B
{virtual void Print() { cout E::Print endl ; }
}; int main()
{A a; B b; E e; D d;A * pa a; B * pb b;D * pd d; E * pe e;pa-Print(); // a.Print()被调用输出A::Printpa pb;pa - Print(); // b.Print()被调用输出B::Printpa pd;pa - Print(); // d.Print()被调用输出D::Printpa pe;pa - Print(); // e.Print()被调用输出E::Printreturn 0;
}
示例二
class Base
{
public:void fun1() { fun2(); }virtual void fun2() // 虚函数{ cout Base::fun2() endl; }
};class Derived : public Base
{
public:virtual void fun2() // 虚函数{ cout Derived:fun2() endl; }
};int main()
{Derived d;Base * pBase d;pBase-fun1();return 0;
}
代码修改
class Base
{
public:void fun1() { this-fun2(); // this是基类指针fun2是虚函数所以是多态}
}总结
这里代码迷惑人之处在于Derived 有Base的fun1接口调用了fun1不像平常的调用重写的虚方法。
this 指针的作用就是指向成员函数所作用的对象 所以非静态成员函数中可以直接使用 this 来代表指向该函数作用的对象的指针。
pBase 指针对象指向的是派生类对象派生类里没有 fun1 成员函数所以就会调用基类的 fun1 成员函数在Base::fun1() 成员函数体里执行 this-fun2() 时实际上指向的是派生类对象的 fun2 成员函数。
因此在非构造函数非析构函数的成员函数中调用「虚函数」就是多态实现!!!
另外在构造函数和析构函数中调用「虚函数」不是多态。编译时即可确定调用的函数是自己的类或基类中定义的函数不会等到运行时才决定调用自己的还是派生类的函数。