假设您具有以下对象层次结构:
class Vehicle {
public:
virtual ~Vehicle() {}
};
class LandCraft: public Vehicle {};
class Truck: public LandCraft {};
现在,我们有两个表达式:
Truck truck;
Vehicle& vehicle = truck;
根据家庭作业的解决方案,第二个表达无效。但为什么?我的编译器根本没有抱怨,我不知道这里应该出现什么问题。
答案 0 :(得分:6)
听起来家庭作业解决方案不正确。从派生的实例初始化对基类型的引用没有任何问题。
修改强>
正如有几个人指出的那样(特别是Slaks)虽然这个声明本身没有任何问题,但它确实提供了未来发生错误的可能性。它允许您任意将Vehicle
放入需要Truck
的地方。例如,请考虑以下
Truck truck;
Vehicle& reallyATruck = truck;
reallyATruck = LandCraft();
糟糕!
答案 1 :(得分:1)
第二个表达式完全有效。您可能会误解解决方案所说的内容。也许它并不是说它在语法上无效,但还有一些其他问题。
当您正在使用的课程没有虚拟功能时,这样做似乎有些奇怪和可疑。
我倾向于家庭作业解决方案是错误的。但是如果得到一些如此简单的错误似乎很奇怪。
答案 2 :(得分:1)
很抱歉,但我已经确认您的代码在Visual Studio 2010中运行良好,除非您在类Vehicle结束时错过了分号。
答案 3 :(得分:1)
SLaks解释了为什么表达不安全,但这是合法的。
根据Comeau的说法,唯一的错误是class Vehicle {} /* HERE */
末尾缺少分号。