static_cast通过包含模板的继承链将无法编译

时间:2018-01-19 00:59:16

标签: c++ templates inheritance

在以下示例中,带有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 *'类型;

Live example

此错误的解释是什么?

1 个答案:

答案 0 :(得分:2)

您收到该错误是因为D实际上并非来自B,因为您忘记TB来自B

然而,动态演员表仍然会编译,因为dynamic_cast可以做到&#34;横向&#34;如果D对象是某个派生类的子对象,也是直接或间接从B派生的,则强制转换也可以成功。但是,在您的示例中,情况并非如此,因此强制转换只会在运行时失败(通过返回空指针)。