通过转换基类指针来设置派生类字段

tam*_*bel 2 c++ language-lawyer

class A
{
public: 
    int a;
};
class B:public A
{
public:
    int b;
    void foo()
    {
        b=a*a;
    }
};
int _tmain(int argc, _TCHAR* argv[])
{ 
    A * a=new A;
    a->a=10;
    ((B*)a)->foo();
    cout<<((B*)a)->b;
}
Run Code Online (Sandbox Code Playgroud)

它的工作b=100原理,但我不知道它的工作原理.b存放在哪里 ?我只是不知道它如何调用谷歌它.

and*_*ras 6

基本上,这里发生的是未定义的行为.它没有特别的名字; 最有可能的是它被称为编程错误.你班级的记忆布局A是:

int a;
Run Code Online (Sandbox Code Playgroud)

内存布局B是:

int a;
int b;
Run Code Online (Sandbox Code Playgroud)

所以在你的情况下,你只分配空间,a但你很幸运,它后面的空间是空闲的(所以没有其他信息被覆盖)并且它没有在未分配的空间上边界(否则,尝试时可能会出现故障)写入未分配的页面).因此b存储在自由空间中.

简而言之:不要依赖这个代码来工作!