您的位置:首页 > 其它

虚函数

2016-02-21 22:03 204 查看

虚函数的概念

谈到虚函数就离不开“多态”,而面向对象语言的核心竞争力就是“多态”。因为“多态”大大缩短了程序员的开发周期,使得很多前辈的成果可以直接使用。而“多态”的三个必要条件:

多态的三个必要条件:

1、要有继承(实现implements)

2、要有重写(overWrite&overRide)

3、父类引用指向子类对像

class CMan
{
public:
virtual void Eat(){……};
void Move();
private:
...
};
class CChild : public CMan //1.继承
{
public:
virtual void Eat(){……};//2.重写
private:
...
};
CMan m_man;
CChild m_child;

CMan *p ;
p = &m_man ;
p->Eat(); //始终调用CMan的Eat成员函数,不会调用 CChild 的
p = &m_child;//3.父类引用指向子类对象
p->Eat(); //如果子类实现(覆盖)了该方法,则始终调用CChild的Eat函数,不会调用CMan 的 Eat 方法;如果子类没有实现该函数,则调用CMan的Eat函数
p->Move(); //子类中没有该成员函数,所以调用的是基类中的


同时在这里需要补充的就是“多态”被称为迟后编译或者滞后编译。也就是在运行的时候才能确定载入哪个函数。

重载函数和虚函数的区别

1)重载函数之间必须在参数的类型或者数量上加以区分,而重新定义的虚函数在参数的类型和数量上必须与原型相同;

2)在定义虚函数的类中,虚函数必须声明为类的成员而不能是友元,可以被声明为其他类的友元;析构函数可以是虚函数,构造函数不行。


虚函数的需要注意的地方

1.如果虚函数在基类和子类中出现的仅仅是名字的相同,而参数类型不同,或者返回类型不同,即使写上virtual关键字,也不进行迟后编译

2.但是有一种例外,如果基类中的虚函数返回一个基类指针或者返回一个基类引用,子类中的虚函数返回一个子类指针或者子类引用,则c++将其视为同名虚函数,进行迟后编译。

3.只有类的成员函数才能说明为虚函数,普通函数不能说明为虚函数。

4.静态成员不能是虚函数,因为静态成员函数不受限与某个对象。

5.内联函数也不能构成虚函数,因为内联函数不能在运行中动态确定其位置。

6.构造函数也不能是虚函数,因为构造时,对象还是一片未定型的空间,虚函数的意义发生与父类引用指向子类对像。

7.析构函数可以构造虚函数。

PS(内联函数:内联函数从源代码层看,有函数的结构,而在编译后,却不具备函数的性质。内联函数不是在调用时发生控制转移,而是在编译时将函数体嵌入在每一个调用处。编译时,类似宏替换,使用函数体替换调用处的函数名。一般在代码中用inline修饰,但是能否形成内联函数,需要看编译器对该函数定义的具体处理。内联扩展是用来消除函数调用时的时间开销。它通常用于频繁执行的函数。 一个小内存空间的函数非常受益。)

纯虚函数的作用

纯虚函数是指在基类中声明但是没有定义的虚函数:virtual type func(param list) = 0;
把虚函数声明为纯虚函数可以强制在派生类中重新定义虚函数,否则编译器会报错。如果一个类至少有一个纯虚函数,则称为抽象类。抽象类只能用来作为其他类的基类,不能定义抽象类的对象,因为在抽象类中有一个或者多个函数没有定义。但是能够使用抽象类来声明指针或者引用。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: