gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 01:38:28 25 4
gpt4 key购买 nike

在下面的示例中,带有 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com