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

隐无影 2015-02-10 04:29:52
类的函数即方法都是公用的,数据是私有的,比如定义一个类的空指针,如果不涉及内部属性即数据,也可以直接调用成功比如

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="<<a<<endl;
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");
}


运行结果



类的函数都是公用的,数据是私有的,比如定义一个类的空指针,如果不涉及内部属性即数据,也可以调用成功, 但这样如果定义一个父类对象,派生类指针指向父类对象,再调用子类的函数(函数涉及内部变量)为啥成功了 ,竟然没报错,求大神解释
...全文
869 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
likfeng 2015-02-10
  • 打赏
  • 举报
回复
用派生类指针引用基类的对象,无论怎么强制转换都是不安全的。
夜想曲 2015-02-10
  • 打赏
  • 举报
回复
楼上正解..在VS2010环境我验证了一把 内存窗口在printC后,在Parent a的八个字节后的四个字节写入了2
微型蚂蚁 2015-02-10
  • 打赏
  • 举报
回复
这个问题应该是这样 Parent里有两个int 8个字节 Child c占4个字节,相对于this偏移8字节 所以printC时,c=2相当于在this偏移8个字节处写入int 2 因为是有效地址,所以不会报错。 但是实际上是越界写入。
微型蚂蚁 2015-02-10
  • 打赏
  • 举报
回复
如果看一下汇编的代码就会很清楚了。
  • 打赏
  • 举报
回复
我感觉是被编译器优化了 因为c的值无论怎么调用这个函数 都是2, 则代码被优化成 void printC() { cout << "c=" << 2 << endl; printf("我是儿子。。。\n"); } 这样就不涉及到成员变量了

64,683

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧