c++虚函数机制

RT。。面试常问的题

首先c++的虚函数机制是用来实现面向对象编程时的多态机制的。多态(Polymorphism)是允许你将父对象设置成为与一个或更多的他的子对象相等的技术。

简单的说:就是允许将子类类型的指针赋值给父类类型的指针。这样在定义一个基类的指针对象p1后,可以通过p1来调用各个子类的函数以实现对基类函数的重写。


示例代码1:

#include<iostream>
using namespace std;

class A
{

public:

    void print()
    {
        cout<<"This is A.."<<endl;
    }

};

class B:public A
{

public:

    void print()
    {
        cout<<"This is B.."<<endl;
    }

};

int main()
{
    A a;
    B b;

    a.print();
    b.print();
}
运行结果:

This is A..
This is B..

确切的说,虽然输出结果不同,但这里并不叫真正实现了多态。原因是多态还有1个关键之处,就是一切用指向基类的指针或引用来操作对象,以实现对基类函数的重写。

于是把上面的代码改成按指针引用,变成示例代码2:

#include<iostream>
using namespace std;

class A
{

public:

    void print()
    {
        cout<<"This is A.."<<endl;
    }

};

class B:public A
{

public:

    void print()
    {
        cout<<"This is B.."<<endl;
    }

};

int main()
{
    A a;
    B b;
    A* p1 = &a;//这里改写成按指针传递而类中声明和实现的部分不变
    A* p2 = &b;
    p1->print();
    p2->print();
}
输出结果为:
This is A..
This is A..


为了解决基类按指针也能实现对各个子类函数的调用以输出不同的结果,这时候需要用到c++的关键字virtual . 直接加在基类的函数前即可(基类若是定义成纯虚函数,则子类中对应的函数全部默认为虚函数,不用再加关键字)。


示例代码3:

#include<iostream>
using namespace std;

class A
{

public:

    virtual void print() //这里与示例2相比改成纯虚函数即可
    {
        cout<<"This is A.."<<endl;
    }

};

class B:public A
{

public:

    void print()
    {
        cout<<"This is B.."<<endl;
    }

};

int main()
{
    A a;
    B b;
    A* p1 = &a;
    A* p2 = &b;
    p1->print();
    p2->print();
}
运行结果即为:

This is A..
This is B..


示例3才叫真正实现了多态。

另外,如果只想在基类中声明一个纯虚函数而不实现它,只需在函数后面加入"=0"即可。基类的函数声明成纯虚函数后,就可以在继承自它的子类下实现对基类函数的重写。

示例代码4:

#include<iostream>
using namespace std;

class A
{

public:

    virtual void print()=0;//这里只声明不写实现
    /*{
        cout<<"This is A.."<<endl;
    }*/

};

class B:public A
{

public:

    void print()
    {
        cout<<"This is B.."<<endl;
    }

};

int main()
{
    //A a;
    B b;
    //A* p1 = &a;
    A* p2 = &b;
    //p1->print();
    p2->print();
}
输出结果即为:

This is B..


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值