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

C++ C++;为什么不是';第二个表达式是否有效?,c++,C++,假设您具有以下对象层次结构: class Vehicle { public: virtual ~Vehicle() {} }; class LandCraft: public Vehicle {}; class Truck: public LandCraft {}; 现在,我们有两个表达式: Truck truck; Vehicle& vehicle = truck; 根据家庭作业的解决方案,第二个表达式无效。但是为什么呢?我的编译器一点也不抱怨,我看不出这里有什么错。那听起来作

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

class Vehicle {
public:
  virtual ~Vehicle() {}
};
class LandCraft: public Vehicle {};
class Truck: public LandCraft {};
现在,我们有两个表达式:

Truck truck;
Vehicle& vehicle = truck;

根据家庭作业的解决方案,第二个表达式无效。但是为什么呢?我的编译器一点也不抱怨,我看不出这里有什么错。

那听起来作业解决方案不正确。从派生类型的实例初始化对基类型的引用没有错

编辑

正如一些人所指出的(特别是Slaks),虽然这句话本身并没有错,但它确实为将来的错误提供了可能性。它允许您任意将任何
车辆
放置在需要
卡车
的位置。例如,考虑下面的

Truck truck;
Vehicle& reallyATruck = truck;
reallyATruck = LandCraft();

哎呀

第二个表达式完全有效。您可能误解了解决方案所说的某些内容。也许它并不是说它在语法上是无效的,而是说它还有其他一些问题

当您使用的类没有虚拟函数时,这样做似乎有点奇怪和可疑


我倾向于认为家庭作业的解决方案是完全错误的。但是,它把这么简单的事情弄错了似乎很奇怪。

对不起,我已经验证了您的代码在Visual Studio 2010中运行良好,只是您在课程结束时漏掉了一个分号。

SLaks解释了为什么该表达式不安全,但它是合法的


根据Comeau的说法,唯一的错误是
类Vehicle{}/*的末尾缺少分号,这里*/

哪个编译器?您是否尝试过
-pedantic
标志(或等效标志)?对我来说似乎也是正确的,因为您通过引用
车辆来避免“切片”问题。对我来说很好。该问题是否实际使用了
车辆&
?如果它只使用
Vehicle
,那么您将有切分问题。在pedantic上编译很好,我看不出有任何问题。Vehicle类定义需要一个分号。@SLaks:编辑后它是正确的,我希望人们开始逆转他们的反对票。这个表达式无论如何都不安全,事实上,它在论点传递中的应用非常广泛。可以分割不同类型的对象(SLaks演示了这一点)这一事实与表达式无关。为了说明这一点,我只在编辑后阅读了SLaks答案,并为此原因进行了否决。@David:正如我对SLaks答案的评论,只有当目标是
常量时(考虑指针,而不是对象),引用和指针才是安全的协变的。只读接口是协变的,只写接口是逆变的。我在这里没有看到任何不安全的东西。这只是一个切片问题,与引用无关,只是多态性。