首页 > 编程语言 > 详细

C++ 虚函数

时间:2015-06-23 11:29:45      阅读:127      评论:0      收藏:0      [点我收藏+]

那些被 virtual 修饰的成员函数,就是虚函数。

虚函数的作用同函数重载一样,也是为了实现多态性。

 

以下示例中 A 和 B 定义了相同接口,分别调用时,输出不同。

class A {
public:
    void print() { cout << "a" << endl; }
};

class B: public A {
public:
    void print() { cout << "b" << endl; }
};

int main()
{
    A a;
    B b;
    a.print();
    b.print();

    return 0;
}

技术分享

 

但以上并不是多态,多态还有一个关键之处就是:一切用指向基类的指针或引用来操作对象。

把以上代码的 main() 函数改一下:

int main()
{
    A a;
    B b;
    A *pa = &a;
    A *pb = &b;
    pa->print();
    pb->print();

    return 0;
}

结果如下:

技术分享

 

问题来了,pb 明明指向的是 class B 的对象,但调用的却是 class A 的 print() 函数。

这不是我们所期望的结果,解决这个问题就需要用到虚函数。修改A、B的定义如下:

class A {
public:
    virtual void print() { cout << "this is a" << endl; }
};

class B: public A {
public:
    void print() { cout << "this is b" << endl; }
};

结果如下:

技术分享

 

类A的成员函数 print() 已经成了虚函数,并且类B的成员函数 print() 也成了虚函数,当基类的成员函数高为 virtual,

其派生类的同名函数也会自动变成虚函数(不用再加 virtual修饰)。所以类B的 print() 也成了虚函数。

 

总之,指向基类的指针在操作它的多态对象时,会根据不同的类对象,调用其相应的函数,这个函数就是虚函数。

而不是根据自身类对象的类型调用相应的函数。

C++ 虚函数

原文:http://www.cnblogs.com/aqing1987/p/4594864.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!