gpt4 book ai didi

c++ - C++类的重新定义

转载 作者:行者123 更新时间:2023-11-28 07:07:44 26 4
gpt4 key购买 nike

我有这段代码,我无法更改:

啊啊

 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 的类中访问 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 吗?

最佳答案

不,这不安全。

理论上,只要 D 的第一部分与 B 相同,您就可以让它工作。您也可以将新内容附加到 D

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

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

关于c++ - C++类的重新定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21515635/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com