作者热门文章
- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
在下面的代码中,同时构造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/
我来自 Asp.Net 世界,试图理解 Angular State 的含义。 什么是 Angular 状态?它类似于Asp.Net中的ascx组件吗?是子页面吗?它类似于工作流程状态吗? 我听到很多人
我一直在寻找 3 态拨动开关,但运气不佳。 基本上我需要一个具有以下状态的开关: |开 |不适用 |关 | slider 默认从中间开始,一旦用户向左或向右滑动,就无法回到N/A(未回答)状态。 有人
我是一名优秀的程序员,十分优秀!