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

标签 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);

} 

错误:

error: invalid static_cast from type ‘D*’ to type ‘B*’ in B *pbc = static_cast(pd);

Live example

这个错误的解释是什么?

最佳答案

你得到这个错误是因为 D 实际上不是从 B 派生的,因为你忘了让 TB 派生自 B.

然而,动态转换仍然可以编译,因为 dynamic_cast 也可以进行“横向”转换——如果 D 对象是一个子对象,转换实际上可以成功一些也直接或间接派生自 B 的派生类。但是,在您的示例中,情况并非如此,因此转换只会在运行时失败(通过返回空指针)。

关于c++ - 通过包含模板的继承链的 static_cast 将无法编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48332634/

相关文章:

c++ - 从控制台和 gui 应用程序的输入设计中读取值 (c++)

c++ - 如果 I/O read() 处于阻塞阶段,如何使用 Ctrl+C 退出 C++ 程序?

c++ - 基于 Qt 的 GUI 来执行 shell 脚本

c++ - 具有模板参数推导的构造函数意外执行

c++ - C++可变参数模板参数方法传递给没有可变参数的方法

node.js - Loopback - 扩展内置模型的最简单方法

c++ - 带有 lambda 表达式的模板类中的语法错误

c++ - 如何区分构造函数

php - 通知接口(interface)方法是通过__call实现的?

C++子类访问修饰符?