gpt4 book ai didi

C++ dynamic_cast - 多态要求和向下转型

转载 作者:可可西里 更新时间:2023-11-01 15:38:21 25 4
gpt4 key购买 nike

在下面的代码中,同时构造obj在情况 1 中,我们构造一个 derived类对象也是,但其成员函数无法访问obj .因此,在向下转换时(即情况 2),使用 obj作为来源,我们有构建的 derived已经在里面了。为什么 obj需要多态吗?

如果我上面的描述让你感到困惑,为什么不 obj向上转型时需要多态,但向下转型时 确实在使用 dynamic_cast 时需要多态?

class base
{
public:
base()
{
cout<< " \n base constructor \n";
}
};

class derived : public base
{
public:
derived()
{
cout << " \n derived constructor \n";
}
};

base *obj = dynamic_cast<base*> (new derived); // case 1: explicitly upcasting
derived *OBJ = dynamic_cast<derived*> (obj); // case 2: error

最佳答案

为了使dynamic_cast 起作用,对象需要是多态的。这样做的原因是 dynamic_cast 需要在某处存储将用于执行转换的类型信息,它通过将信息与类的 vtable 一起存储来实现。为了有一个 vtable,您需要至少使一个方法成为虚拟的。

解决此问题的最简单方法是将基类析构函数标记为虚拟。

向上转型(即派生到基础)不需要转型,因为编译器能够检查转型是否在编译时有效。但是,向下转型时情况并非如此。

关于C++ dynamic_cast - 多态要求和向下转型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4644753/

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