C++ C+的重新定义+;班级

C++ C+的重新定义+;班级,c++,inheritance,redefinition,C++,Inheritance,Redefinition,我有我无法更改的代码: A.h A.cxx 我想在继承a的类中访问b及其方法(foo或bar或继承的方法)。 我可以这样做吗 C.h C.cxx 安全吗?允许吗?我试过了,它似乎有效。 如果它是安全的,我可以用更多的静态方法、方法甚至属性来扩展D吗?不,它不安全 理论上,只要D的第一部分与B相同,您就可以让它工作。您可能还可以在D中添加新的内容 但实际上,这通常是一个非常糟糕的主意。您依赖于手动保持类之间的同步。更重要的是,您依赖于编译器以完全相同的方式处理这两个类,这可能取决于各种配置选项(例

我有我无法更改的代码:

A.h

A.cxx

我想在继承a的类中访问b及其方法(foo或bar或继承的方法)。 我可以这样做吗

C.h

C.cxx

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

不,它不安全

理论上,只要
D
的第一部分与
B
相同,您就可以让它工作。您可能还可以在
D
中添加新的内容

但实际上,这通常是一个非常糟糕的主意。您依赖于手动保持类之间的同步。更重要的是,您依赖于编译器以完全相同的方式处理这两个类,这可能取决于各种配置选项(例如打包)


如果你犯了一点小错误,那么你将得到未定义的行为,因为程序最终可能访问或执行任意的东西。关键的是,它可能会工作一段时间,然后突然以各种方式意外中断。这类问题可能很难找到,因为您故意绕过编译器的类型检查。

我该怎么办?我需要访问这个类。我也可以在C.cxx中包含A.cxx,但我得到一个警告:警告:“…”有一个字段“…”,其类型使用匿名命名空间。这是一个更好的主意吗?我同意“同步类”部分。但考虑到在这个复制的类中根本没有属性,它真的可以随时中断吗?如果我调用d.foo(),将执行哪个二进制代码?如果类
B
没有属性,那么为什么函数必须是成员方法呢?您可以将它们声明为全局函数并直接调用它们,忽略对象。我不能修改类B中的任何内容。实际上,B本身没有属性,但它有继承的属性,我需要访问这些属性。在这种情况下,最好是
重新解释\u cast
指向基类类型的指针。这并不理想,您将无法访问其任何受保护的成员。但是,由于您正在将指针强制转换到一个合法地位于其继承层次结构中的类型,因此它应该是安全的。(为了额外的安全性,您通常希望在这种情况下使用
dynamic_cast
。但是,这是不可能的,因为
B
声明是隐藏的。)从编译器的角度来看,这将起作用,因为它是
d
类型的简单副本。但是,从设计的角度来看,我不知道这是否被允许。
 class B;
 class A
{
  A();
  void * getB();
  private:
  B * b;
}
namespace
{
    class B : public QTabWidget
    {
        foo()
        {
         ...
        }
        bar()
        {
         ...
        }
    }
}
A::A()
{
    b = new B();
}
A::getB()
{
    return b;
}
class C : public A
{
  C();
  private:
  D * d;
}
namespace
{
    class D : public QTabWidget //Exact copy of class B
    {
        foo()
        {
        ... 
        }
        bar()
        {
        ...
        }
    }
}
C::C()
{
    d = (D*) getB();
    d.foo()
    d.bar()
}