码迷,mamicode.com
首页 > 编程语言 > 详细

C++ 虚函数

时间:2015-06-23 11:32:39      阅读:118      评论: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
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!