父类子类指针相互转换问题

摘要:
1.当类指针指向自己类的对象时,无论是调用虚函数还是实函数,它都会调用自己的:2。当指向父类对象的父类指针被强制转换为子类指针时,当子类指针调用函数时,只有不可重写的函数是自己的,虚拟函数是父类;3.当指向子类对象的子类指针被强制转换为父类指针时,即父类指针指向子类。此时,父类指针调用的虚函数都是子类,非虚函数都属于自己的;以上三句话可以概括为一句话:当父类和子类具有同名的非虚拟函数时

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;
}

执行结果如下图:

父类子类指针相互转换问题第1张

免责声明:文章转载自《父类子类指针相互转换问题》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇ELK学习笔记之Elasticsearch删除指定日期的数据(脚本+定时任务)ARM版ubuntu18.04实现程序延时随机启动下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

iOS开发面试题整理

1、类别的作用?继承和类别在实现中有何区别? category 可以在不获悉,不改变原来代码的情况下往里面添加新的方法,只能添加,不能删除修改。并且如果类别和原来类中的方法产生名称冲突,则类别将覆盖原来的方法,因为类别具有更高的优先级。 类别主要有3个作用: (1)将类的实现分散到多个不同文件或多个不同框架中。 (2)创建对私有方法的前向引用。 (3)向对...

鼠标指针下总出现一个滚动条似的方框,怎么办?有图

鼠标指针下总出现一个滚动条似的方框,怎么办?有图 本人的解决办法: 控制面板 -》硬件声音-》鼠标-》指针-》去掉最下面允许主题更改指针(L)的复选框-》点击确定。   ps:也可以从桌面-》右键-》个性化-》更改鼠标指针-》指针 进去设置...

双指针应用一:碰撞指针

1、翻转数组中的元素:s = ['l', 'e', 'e', 't', 'c', 'o', 'd', 'e'] 算法思路:定义左指针 i=0, 右指针 r = len(s)-1。交换指针对应的元素,然后同时向中间移动指针,直到指针碰撞。在指针移动的同时,交换指针指代的元素。 def reverseStr(s): l=0 r=len(s)-1...

掩膜(mask)

1.掩膜(mask)的定义 用选定的图像,图形或物体,对处理的图像(全部或局部)进行遮挡,来控制图像处理的区域或处理过程。用于覆盖的特定图像或物体称为掩模或模板。光学图像处理中,掩模可以足胶片,滤光片等。 掩模是由0和1组成的一个二进制图像。当在某一功能中应用掩模时,1值区域被处理,被屏蔽的0值区域不被包括在计算中。通过指定的数据值,数据范围,有限或无限值...

C++星号的含义

[转载] [http://blog.sina.com.cn/s/blog_4a50d85b0100uk3c.html]   1、乘法运算符   2、定义指针 int *p = 0; 还是 int* p = 0;? 后一种比较容易这样理解:定义了一个变量p,它是指针型的(更详细一点,是指向int的指针型),相比而言,前面一种定义似乎是定义了*P这个奇...

《游戏引擎架构》笔记六

资源及文件系统 载入及管理多种媒体,是游戏引擎必须具备的能力。多数引擎会采用某种类型的资源(或资产)管理器,载入并管理游戏所需的资源,并确保在同一时间每个媒体文件只可载入一份。每个资源管理器都会大量使用文件系统。本文将介绍现代三维游戏引擎中的各种文件系统API,再分析典型资源管理器的运作方式。 文件系统 文件名和路径 关于文件和文件夹路径的概念,绝对路径和...