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