【发布时间】:2010-05-05 16:38:26
【问题描述】:
在我的一个头文件中:
#include "BaseClass.h"
// a forward declaration of DerivedClass, which extends class BaseClass.
class DerivedClass ;
class Foo {
DerivedClass *derived ;
void someMethod() {
// this is the cast I'm worried about.
((BaseClass*)derived)->baseClassMethod() ;
}
};
现在,DerivedClass(在它自己的头文件中)是从 BaseClass 派生的,但是编译器在读取上面的 Foo 类定义时并不知道这一点。但是 Foo 指的是 DerivedClass 指针,而 DerivedClass 指的是 Foo 指针,所以它们不能都知道彼此的声明。
第一个问题是在没有派生类的完整定义的情况下,将派生类指针转换为其基类指针类型是否安全(根据 C++ 规范,而不是在任何给定的编译器中)。
第二个问题是是否有更好的方法。我知道我可以将 someMethod() 的主体移出类定义,但在这种情况下,内联它很重要(实际测量热点的一部分 - 我不是在猜测)。
【问题讨论】:
-
我建议使用 C++ 的强制转换运算符而不是 C 风格的强制转换。你会遇到更少的麻烦,编译器会给你更多的信息。在这里,编译器正在执行
reinterpret_cast,这几乎肯定不是您想要的。 -
如果您希望函数为
inline,请将其标记为inline。无需在类中定义它。您仍然可以在头文件中定义它,以便该定义在包含该头文件的任何 TU 中可用。编译器可能会像您在类定义中定义它一样实际内联它。在这两种情况下都不能保证是内联的。 -
@SteveJessop 也许 OP 想要一些简单的示例代码来说明问题?