当base和child类具有相同的对象名但具有不同的类型时,如何访问子类的datamember。在C ++中

时间:2012-04-13 05:20:45

标签: c++ visual-c++ inheritance parent-child

struct BaseType
{
    int x1;
    float x2;
};

struct ChildType
{
    int y1;
    float y2;
};

Class Base       
{             
    BaseType  obj;           

    void funcBase(BaseType **ptr)
    {

        *ptr = &obj;                   // When this assignment happens ofcourse obj is of the BaseType as the  LHS ptr is pointing to a BaseType                                            

  Now I want to write a C++ equivalent code of the following 2 algorithmic statements,                                       

        BaseType's obj.x1 = ChildTypes's obj.y1;                       
        BaseType's obj.x2 = ChildTypes's.obj.y1;                  


    }               
};

class Child :: public Base
{
    ChildType obj;  

};   

我想从base访问child的obj.y1并将其分配给base的obj.x1。

  

但要记住基础和孩子中的对象名称是一样的   “物镜”。

任何人都可以帮助我。感谢。

2 个答案:

答案 0 :(得分:2)

你的问题有点模糊,但从我可以收集的内容来看,你想要这样的东西:

ChildType* child = dynamic_cast<ChildType*>( &obj );

现在child指向obj,就好像它是ChildType类型一样,假设演员表演成功。

详细了解类型转换here.

编辑:我应该提一下,如果更好的设计可以替代它,那么应该避免像这样的类型转换。也许你应该在这里重新考虑你的整体设计。

EDIT2:鉴于您最近的编辑,这是一个更具体的示例代码块:

ChildType* child = dynamic_cast<ChildType*>( &obj );
obj.x1 = child->y1;
obj.x2 = child->y2;

答案 1 :(得分:1)

认为你有一个Child类型的对象没有实现funcBase(),你想在这个对象上调用funcBase()并让funcBase()访问Child :: obj而不是基地:: OBJ。如果是这样,那么我相信你可以将Child定义为

class Child : virtual public Base
{
    ChildType obj;
    ...
}

Virtual inheritance通常用于解析diamond problem,但我认为您也可以使用它来解决此问题。

如果我的假设不正确,请随意忽略我。