重新定义c ++类

时间:2014-02-02 20:14:58

标签: c++ inheritance redefinition

假设我有这个代码,我无法改变:

A.H

 class B;
 class A
{
  A();
  void * getB();
  private:
  B * b;
}

A.cxx

namespace
{
    class B : public QTabWidget
    {
        foo()
        {
         ...
        }
        bar()
        {
         ...
        }
    }
}
A::A()
{
    b = new B();
}
A::getB()
{
    return b;
}

我希望在继承A的classe中访问b及其方法(foo或bar或继承方法)。 我可以这样做吗?

C.h

class C : public A
{
  C();
  private:
  D * d;
}

C.cxx

namespace
{
    class D : public QTabWidget //Exact copy of class B
    {
        foo()
        {
        ... 
        }
        bar()
        {
        ...
        }
    }
}
C::C()
{
    d = (D*) getB();
    d.foo()
    d.bar()
}

安全吗?是允许的吗?我试过了它似乎工作。 如果它是安全的,我可以用更多的静态方法,方法,甚至属性扩展D?

1 个答案:

答案 0 :(得分:1)

不,这不安全。

理论上,只要D的第一部分与B相同,您就可以使其正常工作。您也可以将新内容添加到D

在实践中,它通常是非常坏主意。您依靠手动保持类彼此同步。更重要的是,您依赖于编译器以完全相同的方式处理这两个类,这可能取决于各种配置选项(例如打包)。

如果你犯了一点点错误,那么你将得到未定义的行为,因为程序最终可能会访问或执行任意的操作。至关重要的是,它可能似乎工作了一段时间,然后突然突然以多种方式突破。这种问题很难追查,因为你故意绕过编译器的类型检查。