在以下示例中,带有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);
}
错误:
错误:从'D *'类型的static_cast无效到B * pbc = static_cast(pd)中的'B *'类型;
此错误的解释是什么?
答案 0 :(得分:2)
您收到该错误是因为D
实际上并非来自B
,因为您忘记TB
来自B
。
然而,动态演员表仍然会编译,因为dynamic_cast
可以做到&#34;横向&#34;如果D
对象是某个派生类的子对象,也是直接或间接从B
派生的,则强制转换也可以成功。但是,在您的示例中,情况并非如此,因此强制转换只会在运行时失败(通过返回空指针)。