在下面的示例中,带有 static_cast
的向上转换将无法编译:
class B {
public:
virtual const void func() = 0;
};
template <typename T>
class TB {
public:
virtual const void func() = 0;
T var;
};
class D : public TB<double> {
public:
const void func() {
std::cout << var << std::endl;
}
};
int main() {
D *pd = nullptr;
B *pbs = static_cast<B*>(pd); // Fails
B *pbd = dynamic_cast<B*>(pd);
}
错误:
error: invalid static_cast from type ‘D*’ to type ‘B*’ in B *pbc = static_cast(pd);
这个错误的解释是什么?
最佳答案
你得到这个错误是因为 D
实际上不是从 B
派生的,因为你忘了让 TB
派生自 B
.
然而,动态转换仍然可以编译,因为 dynamic_cast
也可以进行“横向”转换——如果 D
对象是一个子对象,转换实际上可以成功一些也直接或间接派生自 B
的派生类。但是,在您的示例中,情况并非如此,因此转换只会在运行时失败(通过返回空指针)。
关于c++ - 通过包含模板的继承链的 static_cast 将无法编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48332634/