C ++为什么第二个表达式不是有效的?

时间:2011-02-28 16:09:59

标签: c++

假设您具有以下对象层次结构:

class Vehicle {
public:
  virtual ~Vehicle() {}
};
class LandCraft: public Vehicle {};
class Truck: public LandCraft {};

现在,我们有两个表达式:

Truck truck;
Vehicle& vehicle = truck;

根据家庭作业的解决方案,第二个表达无效。但为什么?我的编译器根本没有抱怨,我不知道这里应该出现什么问题。

4 个答案:

答案 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 */末尾缺少分号。