假设我有这个代码,我无法改变:
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?
答案 0 :(得分:1)
不,这不安全。
理论上,只要D
的第一部分与B
相同,您就可以使其正常工作。您也可以将新内容添加到D
。
在实践中,它通常是非常坏主意。您依靠手动保持类彼此同步。更重要的是,您依赖于编译器以完全相同的方式处理这两个类,这可能取决于各种配置选项(例如打包)。
如果你犯了一点点错误,那么你将得到未定义的行为,因为程序最终可能会访问或执行任意的操作。至关重要的是,它可能似乎工作了一段时间,然后突然突然以多种方式突破。这种问题很难追查,因为你故意绕过编译器的类型检查。