热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

关于子类指针指向父类对象

类的函数即方法都是公用的,数据是私有的,比如定义一个类的空指针,如果不涉及内部属性即数据,也可以直接调用成功比如classParent{public:voidprintP(){
类的函数即方法都是公用的,数据是私有的,比如定义一个类的空指针,如果不涉及内部属性即数据,也可以直接调用成功比如

class Parent
{
public:
void printP()
{
printf("我是爹。。。\n");
}
protected:
int a;
int b;
};
定义一个Parent *k=nullptr; k->printp();//这样是可以正确调用的



现在问题来了,如果这样
class Parent
{
public:
void printP()
{   a=2;
            cout<<"a="< printf("我是爹。。。\n");
}
protected:
int a;
int b;
};
按照上面定义一个空指针调用肯定报错的,这我是知道的,但



#include "iostream"
using namespace std;

class Parent
{
public:
void printP()
{
a = 1;
cout << "a=" << a << endl;
printf("我是爹。。。\n");
}
protected:
int a;
int b;
};

class Child : public Parent
{
public:
Child()
{
a = 0; b = 0; c = 0;
}
void printC()
{
c = 2;
cout << "c=" << c << endl;
printf("我是儿子。。。\n");
}
protected:
private:
int c;
};

void main()
{
Parent a;//定义一个父类对象
Child *q = (Child*)(&a);//派生类指针强制指向父类对象
q->printC();//派生类指针调用派生类函数(涉及内部数据),
system("pause");
}


运行结果



类的函数都是公用的,数据是私有的,比如定义一个类的空指针,如果不涉及内部属性即数据,也可以调用成功,   但这样如果定义一个父类对象,派生类指针指向父类对象,再调用子类的函数(函数涉及内部变量)为啥成功了 ,竟然没报错,求大神解释

5 个解决方案

#1


我感觉是被编译器优化了
因为c的值无论怎么调用这个函数 都是2,
则代码被优化成
void printC()
    {
        cout << "c=" << 2 << endl;
        printf("我是儿子。。。\n");
    }
这样就不涉及到成员变量了

#2


如果看一下汇编的代码就会很清楚了。

#3


这个问题应该是这样
Parent里有两个int 8个字节
Child c占4个字节,相对于this偏移8字节
所以printC时,c=2相当于在this偏移8个字节处写入int 2
因为是有效地址,所以不会报错。
但是实际上是越界写入。

#4


楼上正解..在VS2010环境我验证了一把 内存窗口在printC后,在Parent a的八个字节后的四个字节写入了2

#5


用派生类指针引用基类的对象,无论怎么强制转换都是不安全的。

推荐阅读
author-avatar
哭泣的玫瑰花丶_443
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有