static_cast
:静态类型转换dynamic_cast
:动态类型转换
nullptr
reinterpret_cast
:强制转换
const_cast
:常量转换,将同类型的常量强制转换为同类型的非常量
const_cast<T*>
可将 const T*
转换为 T*
const_cast
不改变内存的实际可写性,尝试对内存进行写操作可能会导致未定义行为(Undefined Behaviour,UB)图示:箭头由派生类指向基类
class Employee {
protected:
string name;
EmpID id;
};
class MTS: public Employee {
protected:
Degrees degree_info;
};
class Temporary {
protected:
Company employer;
};
// 发生多重继承的类:Consultant 类包含了 MTS 和 Temporary 类的所有属性
class Consultant: public MTS, public Temporary {
...
};
菱形多重继承问题 Vanilla MI
struct B1 { int m_i; };
struct D1: public B1 {};
struct D2: public B1 {};
// 发生菱形多重继承问题的类:D1、D2 具有公共的基类 B1,使得 B1 在 M 中被包含两次
struct M: public D1, public D2 {};
int main() {
M m;
m.m_i++; // Error: D1::B1.m_i or D2::B1.m_i?
B1* p = &m; // Error: which B1?
B1* p1 = static_cast<D1*>(&m); // OK
B1* p1 = static_cast<D2*>(&m); // OK
}
解决办法:Virtual Base Class
struct B1 { int m_i; };
struct D1: virtual public B1 {};
struct D2: virtual public B1 {};
// 发生多重继承的类:D1、D2 具有公共的基类 B1,由于使用虚继承,使得 B1 在 M 中仅包含一次
struct M: public D1, public D2 {};
int main() {
M m;
m.m_i++; // OK
B1* p = &m; // OK
}