簡體   English   中英

返回子類的const引用

[英]return const reference of subclass

我知道的

我知道返回一個臨時對象的const引用是可以的! (像這個例子:)

class A {
public:
  virtual const A& clone () { return (A()); }
  virtual std::string name() const { return ("A"); }
};

返回臨時對象並綁定到const引用

但!

如果我想這樣做,它仍然是正確的:

class B : public A {
public:
  virtual const A& clone () { return (B()); }
  virtual std::string name() const { return ("B"); }
};

我認為是的,但在執行時,返回的對象仍被視為A對象(如本例:)

main.cpp中

#include <iostream>
#include <string>
int main() {
  B bb;
  A* aa = &bb;

  std::cout << aa->clone().name() << std::endl;
}

產量

valgrind ./a.out
==14106== Use of uninitialised value of size 8
==14106==    at 0x401BF9: main (main.cpp:8)
==14106==  Uninitialised value was created by a stack allocation
==14106==    at 0x401BF2: main (main.cpp:8)
B

這是一個B .. yay ..但這個警告非常可怕......

編輯

謝謝你,我知道看到我的錯誤...但我想知道其他一些事情......

執行此操作時,堆棧中到底發生了什么?

將引用綁定到臨時表會延長臨時表的生命周期...除非它沒有。 §12.2[class.temporary] / p5,重點補充:

綁定引用的臨時對象或綁定引用的子對象的完整對象的臨時對象在引用的生命周期內持續存在,除了:

  • 綁定到構造函數的ctor-initializer (12.6.2)中的引用成員的臨時綁定將持續存在,直到構造函數退出。
  • 函數調用(5.2.2)中的引用參數的臨時綁定將持續到包含該調用的完整表達式完成為止。
  • 函數返回語句(6.6.3)中返回值臨時綁定的生命周期未擴展; 臨時在return語句中的full-expression結束時被銷毀。
  • new-initializer (5.3.4)中對引用的臨時綁定將持續到包含new-initializer的full-expression完成為止。

你鏈接的問題中的情況( std::string foo(); const std::string & s = foo(); )是可以的; foo()返回的臨時生命周期延長到s的生命周期結束。 在您的代碼中,臨時綁定到返回的值,並且根據上面的第三個項目符號點,它的生命周期不會延長,並且您的函數返回一個懸空引用。

通常來說, clone()函數應返回指向堆分配副本的指針。

暫無
暫無

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

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