簡體   English   中英

無法使用base clase rvalue初始化指向子類的指針

[英]Cannot initialize pointer to a subclass with base clase rvalue

我對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();

答案應該是:

不編譯。 無法使用學生rvalue初始化EconomyStudent *。

我知道並理解,不能初始化指向子類的指針和baseclase對象的地址,並且這不能編譯。 我不明白的是右值。 聲明rvalue以使答案有效是否真的很重要? 我的助教堅持但我不這么認為。 你怎么看?

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

我不這么認為。 檢查您嘗試使用左值初始化EconomyStudent *economyStudent的情況:

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

clang抱怨我的機器,說明這一點

錯誤:無法使用“Student *”類型的左值初始化“EconomyStudent *”類型的變量

因此,編譯器輸出方面的唯一區別是rvalue與lvalue。 由於值類別與代碼段中的錯誤類型無關,您可以告訴您的助教,互聯網上的一些隨機用戶認為您是對的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM