gpt4 book ai didi

c++ - dynamic_cast 的正确用例是什么?

转载 作者:IT老高 更新时间:2023-10-28 22:07:03 25 4
gpt4 key购买 nike

我多次被告知(并且在实践中看到我自己)使用 dynamic_cast 通常意味着糟糕的设计,因为它可以而且应该用虚函数代替。

例如,考虑以下代码:

class Base{...};
class Derived:public Base{...};
...
Base* createSomeObject(); // Might create a Derived object
...
Base* obj = createSomeObject();
if(dynamic_cast<Derived*>(obj)){
// do stuff in one way
}
else{
// do stuff in some other way
}

可以很容易地看出,我们可以将一个虚函数 doStuff() 添加到 Base 并在 Derived 中重新实现,而不是编写动态转换.

在这种情况下,我的问题是,为什么我们在语言中有 dynamic_cast 呢?有没有使用 dynamic_cast 合理的例子?

最佳答案

虚函数的问题在于层次结构中的所有必须有一个实现或者是抽象的,这绝对不是正确的做法。比如如果Base是一个接口(interface),而在if中,你需要访问Derived的内部实现细节怎么办?这在虚拟功能中肯定是不可行的。此外,在某些多重继承情况下,向上转换和向下转换都需要 dynamic_cast。并且在虚拟功能中可以做的事情是有限制的——例如,模板。最后,有时您需要存储 Derived*,而不仅仅是在其上调用函数。

从本质上讲,虚函数只在部分情况下起作用,而不是全部

关于c++ - dynamic_cast 的正确用例是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5776777/

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