向下类型转换过程
Downcasting procedure
有谁能解释一下这种向下转换方式是否正确,或者我们应该使用显式类型转换?
#include<iostream>
using namespace std;
class base {
public:
virtual void func() { cout<<"Base n"; }
void fun() { cout<<"fun"; }
};
class derived1 : public base {
public:
void func() { cout<<"Derived 1n"; };
void fun() { cout<<"fun1"; }
};
class derived2 : public derived1 {
public:
void func() { cout<<"Derived 2n"; }
void fun() { cout<<"fun2"; }
};
int main()
{
base * var = new derived1;
((base *) var)-> fun();
((derived1 *) var)-> fun();
((derived2 *) var)-> fun();
// How does this work?
}
((base *) var)-> fun();
和((derived1 *) var)-> fun();
是有效的,但不是好的做法。你应该使用C++
风格的铸造(static_cast
, dynamic_cast
..),而不是c-style
铸造。
((derived2 *) var)-> fun();
是无效的,因为var
不是真正的derived2
类。如果使用dynamic_cast
进行强制转换,它将失败。但这里它工作,因为对象对齐在C++
。在代码部分中,派生成员通常按照定义的顺序排列在基成员之后。因此,在这种情况下,derived1::fun
和derived2::fun
将从相同的偏移量开始,因此调用它是有效的。虽然转换为derived2*
后的对象无效,但它可以工作,因为fun
不访问类的任何成员。但是这种行为是不可预测的,一定不能依赖于它或者使用这种代码
首先,这里base * var = new derived1;
是向上铸造。
第二,用dynamic_cast
做下铸件比较安全。
derived1 *d1 = dynamic_cast<derived1*>(var);
if(d1) d1->fun();
derived2 *d2 = dynamic_cast<derived2*>(var); // will return NULL
if(d2) d2->fun();
相关文章:
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- C++中的双指针类型转换
- 逐位操作的隐式类型转换
- 模板中的类型转换
- 在 C++(和 C)中进行类型转换时明显不一致
- 字符类型转换不兼容
- 将复杂的非基元C++数据类型转换为 Erlang/Elixir 格式,以使用 NIF 导出方法
- C++:用户定义的显式类型转换函数错误
- 将类指针类型转换为键时出错
- 通过引用传递参数时C++类型转换
- 在 C++ 中将一个模板类型的对象类型转换为另一个模板类型
- C++显式类型转换(C 样式强制转换)的强制表示法和static_cast的多种解释
- C++无效的函数类型转换
- 在将派生类指针类型转换为派生类指针后,从基类指针调用派生类函数
- 如何将Windows产品类型转换为名称?
- 通过构造函数方法输出的类到类类型转换是 5500 为什么不是 5555
- 复制构造函数是如何在从类类型到类类型的类型转换过程中引发的
- 向下类型转换过程
- 在计算过程中将int类型转换为long long的优点是什么?