私が知っていること
一時オブジェクトの const 参照を返すことは問題ないことを知っています! (この例のように:)
class A {
public:
virtual const A& clone () { return (A()); }
virtual std::string name() const { return ("A"); }
};
しかし!
私がそれをしたいのなら、それはまだ正しいです:
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..イェーイ..しかし、この警告は非常に恐ろしいです....
編集
あなたのおかげで、私は自分のエラーを見ていることを知っています...しかし、それについて他のことを知りたいです...
これが実行されると、スタック内で正確に何が起こっているのでしょうか?