我对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";
  }
};

问题是:


Student student;
student.checkFinances();
EconomyStudent* economyStudent = &student;
economyStudent->checkFinances();

答案应该是:



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

最佳答案



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

 Student student;
 student.checkFinances();
 Student *lvalue = &student;
 EconomyStudent* economyStudent = lvalue;
clang在我的机器上抱怨说



因此,就编译器输出而言,唯一的区别是右值与左值。由于值类别与摘要中的错误类型无关,因此您可以告诉您的助教,互联网上的一些随机用户认为您是对的。

09-05 06:28