我们在工作中的代码库中遇到了这种情况,并且我们就这是否是有效的 C++ 进行了激烈的争论。这是我能想到的最简单的代码示例:
template <class T>
class A {
public:
A() { subclass = static_cast<T*>(this); }
virtual void Foo() = 0;
protected:
T* subclass;
};
class C : public A<C> {
public:
C(int i) : i(i) { }
virtual void Foo() { subclass->Bar(); }
void Bar() { std::cout << "i is " << i << std::endl; }
private:
int i;
};
int main() {
C c(5);
c.Foo();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这段代码在实践中 100% 有效(只要模板参数类型与子类类型匹配),但是如果我们通过运行时分析器运行它,它会告诉我们 是static_cast无效的,因为我们正在转换this为 a C* …