虚函数和纯虚函数(二)

#include <iostream>
#include <cstdio>

using namespace std;

class A
{
public:
    void foo()
    {
        printf("1\n");
    }
    virtual void fuu()
    {
        printf("2\n");    
    }
};

class B:public A
{
public :
    void foo()
    {
        printf("3\n");
    }
    void fuu()
    {
        printf("4\n");
    }
};

int main()
{
    A a;
    B b;
    
    A *p = &a;//p是基类指针,指向基类对象
    cout<< "p->foo()---" ; p->foo() ; 
    cout<<"p->fuu()---";p->fuu(); //调用基类a本身的函数,因此输出结果为2   

    cout <<"-------向上转型-----------"<<endl;
    p=&b;//基类指针指向子类对象,正式体现多态的用法,
    cout<<"p->foo()---";p->foo();   //因为指针p是个基类指针,因此此时指向的只能是基类的foo()函数代码了,因此输出结果还是1 
    cout<<"p->fuu()---";p->fuu(); //   指针p是个基类指针,但指向的fuu是一个虚函数,由于每个虚函数都有一个虚函数列表,此时p调用fuu()并不是直接调用函数,而是通过虚函数列表找到相应的函数的地址,
	//因为现在p指向了子类b的地址,这里将找到对应的子类b的fuu()函数的地址,因此输出的结果也会是子类的结果4.
    
    cout <<"--------向下转型----------"<<endl;
    
   B *ptr =(B *)&a;//(B *)强制转化为B型指针
	//B *ptr =&a;//这种写法是错误的,因为指针ptr是B类性的,地址a所指向的是A类的地址,两个类型不一样,
    cout<<"ptr->foo()----";ptr->foo();//ptr是B类指针,foo()是一般的函数,所以仍然指向子类B中的函数,输出为3
    cout<<"ptr->fuu()-----";ptr->fuu();//尽管ptr是B类指针,但因为fuu()是纯虚函数,所以指向了地址A的fuu函数,输出为2
    return 0;
}

运行结果

小结:1.有virtual才可能发生多态现象2.不发生多态(无virtual)调用就按原类型调用

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值