【发布时间】:2014-10-23 16:19:35
【问题描述】:
我写了一个 B 类作为 A 的子类来扩展它。现在我想改变所有的
a = A::create();
到
a = (A*)B::create();
一切正常。但我不想在创建 A 对象的任何地方手动更改代码。 所以我尝试了以下#define指令
#define A::create (A*)B::create
但它根本不起作用。 我不知道问题是什么。有什么帮助吗?我可以将 #define 指令与 :: 一起使用吗?为什么它不起作用?
【问题讨论】:
-
假设
B确实是A的子类并且B::create()返回B*,则您不需要演员表。如果代码需要更改,您真的应该更改代码,而不是让未来的调试器想知道为什么A::create会做其他事情而不是创建A。 -
我强烈建议不要尝试以这种方式解决问题 - 如果您需要在任何地方更改代码,最好直接在任何地方更改代码或找到某种方法来引入另一个级别的间接性。
-
如果对
A::create的每个 调用都必须更改,为什么不直接更改A::create所做的呢?在任何情况下,都要避免 C 风格的强制转换。 -
如果
B是A的派生类型,并且如果B::create()返回B*,那么你甚至不需要强制转换——从指针到派生的转换指向基址的指针是隐含的。
标签: c++