在受控情况下更改基类变量的类型?

时间:2014-11-11 01:01:13

标签: c++ class casting borland-c++

假设:

class A 
{
public:
A *Parent;
};

class B : public A
{
protected:
B *BParent;
};

但A和B中的'Parent'和'BParent'都需要占用相同的内存空间! B'中的BParent实际上是A,但是对于所有B对象,父对象也总是B,并且它更容易访问仅B函数和变量,而不需要将Parent转换为B所有所有B中的时间和B继承类的时间,并且不需要在A中虚拟化所有可能需要的东西。

这可能吗? 以下显然不起作用,但有哪些类似 的工作?

class B : public A
    {
    protected:
    union {
      A::Parent ;
      B *BParent;
      };
    };

我宁愿避免:

class A
{
public:
union {
  A *Parent ;
  class B *BParent ;
  };
};

哪个会奏效。如果有一种方法可以在A中使BParent为私有并仍然在B中访问它,那么我会使用后一种方法,这样它就会对从A继承的所有非B对象隐藏。

1 个答案:

答案 0 :(得分:1)

不完全确定你要求的是什么,但现在就去了。

我猜你想要保存对继承的父级的某种访问权限但是适用于派生类型。也许你正在寻找这个:

template <class T>
class A
{
private:
    T *parent;
};

class B : public A<B>
{

};

但似乎你想要保留A和B ......

所以也许你真正想要的是:

class A
{
protected:
    A *AParent() { return parent; }
protected:
    A *parent;
};

class B : public A
{
protected:
    B *BParent() { return (B*)parent; };
};

请注意,如果要为两者使用相同的内存,则它们必须相同。简单地投射指针应该做你想要的。