一、类型转换 Named Casts

1. C++ 四种类型转换

  1. static_cast:静态类型转换
  2. dynamic_cast:动态类型转换
  3. reinterpret_cast:强制转换
  4. const_cast:常量转换,将同类型的常量强制转换为同类型的非常量

2. 类型转换示例

image.png

image.png

image.png

image.png

image.png

二、多重继承 Multiple Inheritance

1. 基本概念

图示:箭头由派生类指向基类

图示:箭头由派生类指向基类

image.png

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 {
	...
};

2. 菱形多重继承问题 Vanilla MI

  1. 菱形多重继承问题 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
    }
    
  2. 解决办法: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
    }
    

    image.png