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

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

执行结果如下图:

父类子类指针相互转换问题,布布扣,bubuko.com

时间: 2024-10-02 15:10:39

父类子类指针相互转换问题的相关文章

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

1.当自己的类指针指向自己类的对象时,无论调用的是虚函数还是实函数,其调用的都是自己的: 2.当指向父类对象的父类指针被强制转换成子类指针时候,子类指针调用函数时,只有非重写函数是自己的,虚函数是父类的: 3.当指向子类对象的子类指针被强制转换成父类指针的时候,也就是父类指针指向子类对象,此时,父类指针调用的虚函数都是子类的,而非虚函数都是自己的. 将上面三句话总结成一句话就是:当父类子类有同名非虚函数的时候,调用的是转换后的指针类型的函数: 当父类子类有同名虚函数的时候呢,调用的是指针转换前指

腾讯2011一道父类指针和子类指针转化的题目

class ClassA { public: virtual ~ClassA(){} virtual void FunctionA(){} }; class ClassB { public: virtual void FunctionB(){} }; class ClassC :public ClassA , public ClassB { }; 关于pA,pB,pC的取值,下面的描述中正确的是: A.pA,pB,pC的取值相同. B.pC=pA+pB C.pA,pB不相同 D.pC不等于pA也

【C/C++学院】0823-静态联合编译与动态联合编译/父类指针子类指针释放/虚函数/纯虚函数概念以及虚析构函数/抽象类与纯虚函数以及应用/虚函数原理/虚函数分层以及异质链表/类模板的概念以及应用

静态联合编译与动态联合编译 #include <iostream> #include <stdlib.h> //散列 void go(int num) { } void go(char *str) { } //class //::在一个类中 class A { public: void go(int num) { } void go(char *str) { } }; void main() { ///auto p = go;编译的阶段,静态联编 void(*p1)(char *s

子类指针转换成父类指针时,指针值会变化

指针转换在C++中再正常不过了,特别是子类向父类的转换,一般情况下转换后指针值是不会变的.但是某些特殊情况,子类指针转换成父类指针,指针值会产生一定的偏移量,至于为什么就不清楚了.要确保指针值不变,可以先将指针转成void*,再根据实际情况强制转换成需要的类型就可以了. 本文地址:http://www.cnblogs.com/vcpp123/p/5902866.html 参考文章: C++多重继承下的指针类型转换 http://www.veryhuo.com/a/view/52953.html

C++的子类指针指向父类

1,直接用基类指针引用基类对象 2,直接用派生类指针引用派生类对象 3,用基类指针引用一个派生类对象,由于派生类对象也是基类的对象,所以这种引用是安全的, 但是只能引用基类成员.若试图通过基类指针引用那些只在派生类中才有的成员,编译器会报告语法错误.(解决该问题的答案是虚函数和多态性) 4,用派生类指针引用基类的对象.这种引用方式会导致语法错误.派生类指针必须先强制转换为基类指针,这种方法是不安全的.  而在侯捷的深入浅出MFC中第二章C++重要性质中: 1.如果你以一个"基类之指针"

父类的指针无法指向子类对象

父类的指针指向子类的对象,这一特性在c++中叫做多态. 当然,多态还可以有更深的解释. 可是,为什么有时候父类的指针指向不了子类的对象? 有如下两个文件的代码: //B.h class B : public A{}; //main.cpp    Class A; Class B;   void fun(B* b) {     A* a = b;  //这边有错       } 原因是这样子的,有时候我们为了提高编译速度, 会做一些前置声明,比如Class A 告诉编译器A存在. 而后我们可以 A

C++反汇编第三讲,反汇编中识别继承关系,父类,子类,成员对象

讲解目录: 1.各类在内存中的表现形式   备注: 主要复习开发知识,和反汇编没有关系,但是是理解反汇编的前提.     2.子类继承父类 2.1 子类中有虚函数,父类中有虚函数 : 都有的情况下    2.2 子类中没有虚函数,父类中有虚函数 : 子类没有,父类有的情况 2.1 2.2的情况都是一样的.     2.3   子类中有虚函数,父类中没有虚函数 : 子有父没有的的情况下    2.4 子类父类都没有虚函数的情况下 第二专题大总结. 熟悉反汇编可以直接看这个总结, 3.结合第二专题的

Java父类子类的对象初始化过程

摘要 Java基本的对象初始化过程,子类的初始化,以及涉及到父类和子类的转化时可能引起混乱的情况. 1. 基本初始化过程: 对于一个简单类的初始化过程是: static 修饰的模块(static变量和static 块)  ---> 按照代码顺序依次执行. | 实例变量  及非static模块---> 按照代码顺序依次执行. | 构造函数 ---> 执行对应的构造函数. 子类的初始化过程. 父类static修饰的模块 | 子类static修饰模块 | 父类实例变量和非static块 | 父

java 父类子类成员变量,静态变量,构造器创建先后顺序

关于java中父类子类,成员变量,静态变量,构造器创建的先后顺序,在面试中经常会问到该类型的问题 所以用以下代码进行测试: public class Test { public static void main(String args[]) { Father f = new Son(); } } class Father { public Father() { System.out.println("Father Construct"); } static int fatherStat