zoukankan      html  css  js  c++  java
  • 父类子类指针相互转换问题

    1.当自己的类指针指向自己类的对象时,无论调用的是虚函数还是实函数,其调用的都是自己的:

    2.当指向父类对象的父类指针被强制转换成子类指针时候,子类指针调用函数时,只有非重写函数是自己的,虚函数是父类的;

    3.当指向子类对象的子类指针被强制转换成父类指针的时候,也就是父类指针指向子类对象,此时,父类指针调用的虚函数都是子类的,而非虚函数都是自己的;

    将上面三句话总结成一句话就是:当父类子类有同名非虚函数的时候,调用的是转换后的指针类型的函数;

                  当父类子类有同名虚函数的时候呢,调用的是指针转换前指向的对象类型的函数。

    详见以下代码:

    #include <iostream>
    using namespace std;
    class Base {
    public:
        virtual void f() { cout << "Base::f" << endl; }
        virtual void g() { cout << "Base::g" << endl; }
                void h() { cout << "Base::h" << endl; }
    
    };
    class Derived:public Base
    {
    public:
        virtual void f(){cout<<"Derived::f"<<endl;}
                void g(){cout<<"Derived::g"<<endl;}
                void h(){cout<<"Derived::h"<<endl;}
    };
    
    
    void main()
    {
        Base *pB=new Base();
        cout<<"当基类指针指向基类对象时:"<<endl;
        pB->f();
        pB->g();
        pB->h();
        cout<<endl;
    
        Derived *pD=(Derived*)pB;
        cout<<"当父类指针被强制转换成子类指针时:"<<endl;
        pD->f();
        pD->g();
        pD->h();
        cout<<endl;
    
        Derived *pd=new Derived();
        cout<<"当子类指针指向子类时候"<<endl;
        pd->f();
        pd->g();
        pd->h();
        cout<<endl;
    
        Base *pb=(Base *)pd;
        cout<<"当子类指针被强制转换成父类指针时:"<<endl;
        pb->f();
        pb->g();
        pb->h();
        cout<<endl;
    
        Base *pp=new Derived();
        cout<<"父类指针指向子类对象时候:"<<endl;
        pp->f();
        pp->g();
        pp->h();
        cout<<endl;
    }

    执行结果如下图:

  • 相关阅读:
    dd——留言板再加验证码功能
    怎样去除织梦版权信息中的Power by DedeCms
    数据结构和算法的选择
    数据结构和算法9——哈希表
    数据结构与算法8——二叉树
    数据结构与算法7——高级排序
    数据结构与算法6——递归
    数据结构和算法5——链表
    数据结构与算法4——栈和队列
    数据结构与算法3——简单排序(冒泡、选择、插入排序)
  • 原文地址:https://www.cnblogs.com/mu-tou-man/p/3925433.html
Copyright © 2011-2022 走看看