//多继承与赋值兼容性原则 #include<iostream> using namespace std; class Point{ public: Point(){ a = 1; b = 2; } int a; int b; }; class PointA { public: PointA(){ c = 3; } int c; }; class PointB :public Point, public PointA{ }; void ProtectB(){ PointB pb; Point *p1 = &pb; PointA *pa = &pb; cout << "pb的地址" << &pb << endl; cout << "*p1的地址" << p1 << endl; cout << "*pa的地址" << pa << endl; cout << "----------------" << endl; /* 由于观察结果可知: &pb;这个操作,c++编译是对&操作符做重载了, c++编译器对于&pb;这个操作会根据接受地址的类的类型取一个偏移量 Point *p1 = &pb; c++编译器会检测出Point这个类型在PointB的内存内所占内存的空间偏移量,从而返回对应的地址 正因为c++编译器对&操作符的重载,才实现了赋值兼容性原则 运算符重载的本质分析: 运算符重载本质上是定义了一个函数名是 operator操作符 的全局函数 类中的成员函数实现运算符重载也只比全局函数少传递一个参数而已 猜想 : c++编译器编译的时候会将所有operator修饰的操作符存入一张表中 当c++编译器检测到被operator修饰的操作符参与的运算时,会获取这个操作符的各个操作数 并将这个操作数的类型与带有operator关键字的全局函数进行匹配, 如果发现匹配成功,c++编译器会直接执行这个全局函数 将这个全局函数的返回值作为该操作符的返回值 */ } void main(){ ProtectB(); system("pause"); }