C++中的多态性,子类型?

nab*_*bil 2 c++ polymorphism reference

有人可以向我解释最后5行,为什么当Manager是Employee的子对象时会发生这种情况?

ostream& operator << (
   ostream &, const Employee &
);
Employee  e;
Manager   m;
Employee &eRef1 = e;  // OK!     
Employee &eRef2 = m;  // OK!  
Manager  &mRef1 = e;  // Compile error!
Manager  &mRef2 = m;  // OK!
cout << e << m;       // OK! 
Run Code Online (Sandbox Code Playgroud)

And*_*owl 5

这恰好是因为你所说的:Manager源自Employee(我猜这就是你说" Manager是子对象Employee"的意思).这意味着所有实例Manager也是实例Employee,但反之亦然.

在这里,您尝试将对a的引用绑定到Manager类型的对象Employee.但是因为一个实例Employee不是Manager(反过来的那个实例!)你得到一个错误.

如果你想知道为什么这是正确的,再想想如果你没有会发生什么不能得到一个错误:

Employee e;
// ...
Manager& m = e; // This won't work, but let's suppose it did...
int s = m.get_size_of_managed_team(); // Huh?
Run Code Online (Sandbox Code Playgroud)

如果你可以到引用绑定Manager到一个对象,它是不是真的Manager,你可以调用它的功能,实际的对象不支持.这将是混乱.因此,编译器可以防止出现这种情况.