无法使用base clase rvalue初始化指向子类的指针

And*_*ler 3 c++ polymorphism pointers

我对C++考试中的问题有疑问.我和一位助教有很多争执,我想知道,如果我错过了什么.

给出以下代码:

class Student {
public:
  virtual void checkFinanes() {
    std::cout << "I have no money. \n";
  }
};

class ExonomyStudent : public Student {
public:
  virtual void checkFinances() {
    std::cout << "I am making a lot of money.\n";
  }
};
Run Code Online (Sandbox Code Playgroud)

问题是:

以下代码是否编译?如果是这样,当我需要时,控制台上的输出是什么.如果没有,为什么不呢?

Student student;
student.checkFinances();
EconomyStudent* economyStudent = &student;
economyStudent->checkFinances();
Run Code Online (Sandbox Code Playgroud)

答案应该是:

不编译.无法使用学生rvalue初始化EconomyStudent*.

我知道并理解,不能初始化指向子类的指针和baseclase对象的地址,并且这不能编译.我不明白的是右值.声明rvalue以使答案有效是否真的很重要?我的助教坚持但我不这么认为.你怎么看?

lub*_*bgr 5

声明rvalue以使答案有效是否真的很重要?

我不这么认为.检查您尝试EconomyStudent *economyStudent使用左值初始化的情况:

 Student student;
 student.checkFinances();
 Student *lvalue = &student;
 EconomyStudent* economyStudent = lvalue;
Run Code Online (Sandbox Code Playgroud)

clang 抱怨我的机器,说明

错误:无法使用"Student*"类型的左值初始化"EconomyStudent*"类型的变量

因此,编译器输出方面的唯一区别是rvalue与lvalue.由于值类别与片段中的错误类型无关,您可以告诉您的助教,互联网上的一些随机用户认为您是对的.