传递引用 C++,指针向量。这是怎么回事?

Pass By Reference C++, Vector of pointers. What is happening here?

提问人:legameeternoforall 提问时间:8/2/2017 更新时间:8/2/2017 访问量:100

问:

我认为没有任何问题可以指出我正在寻找的解释。

在这个例子(ABC类中的tryme()函数)中,为什么在创建对象时执行父级的myfunction,并且它的引用被直接作为参数传递给函数。

class parent
{
public:
      int abc;
      parent(){};
      ~parent(){};
      virtual void myfunction(void)
      {
          abc = 5;
          output("parent myfunction abc %d", abc);
      };
};

class child :public parent
{

public:
    int abc;
    child(int val):abc(val){};
    child(){};
    ~child(){};

    virtual void myfunction(void)
    {
        output("child myfunction abc %d", abc);
    }
};

class ABC
{
        std::vector<parent *> pvec;
        void test(parent* t)
        {
           pvec.pushback(t);
        }; 

        void tryme()
        {
             child c1 = child(3);
             child c2 = child(6);

             ABC::test(&c1); <-------- this executed child - I understand
             ABC::test(&c2); <-------- this executed child - I understand
             ABC::test(&child(9)); <-------- this executed parent - I dont understand
             ABC::test(&child(11));<-------- this executed parent - I dont understand

             for each (auto it in pvec)
             {
                   it->myfunction();
             }
        }
 }

输出是

   child myfunction abc 3
   child myfunction abc 6
   parent myfunction abc 5
   parent myfunction abc 5

两者之间有什么区别 child c1 = child(3); &c1;

&child(3)

谢谢

C++ 指针 按引用传递

评论

7赞 user7860670 8/2/2017
test(&child(9));将存储一个指向临时对象的悬空指针,该对象在返回后被销毁。所以你在这里面对的是UB。childtest
2赞 8/2/2017
C1 和 C2 也好不到哪里去。
0赞 Hariom Singh 8/2/2017
你确定它被执行了吗?我可以在 xcode 中看到警告 ABC::test(&child(9));获取类型为“child”的临时对象的对象
0赞 legameeternoforall 8/2/2017
@HariomSingh 是的,它被执行了。我的代码略有不同,但我没有看到任何警告。
0赞 legameeternoforall 8/2/2017
@manni66,你说的 c1 和 c2 也好不到哪里去。谢谢。

答:

1赞 Scott Kemp 8/2/2017 #1

有几件事...您的标题表明您是“通过引用传递”。您实际上是在传递“通过指针”。

另外,当您致电时

ABC::test(&c1);

您正在获取堆栈变量的地址并将其传递给您的函数。然后,数组存储对象的地址。这对于前两个调用是可以的。c1

但。。。当您致电时

ABC::test(&child(9));

您正在创建一个临时对象,该对象仅在函数调用期间有效,并将其地址传递给函数,然后函数存储指向临时对象的“悬空”指针。

当函数调用结束时,对象将被销毁。通过数组仍然按住指向现在垃圾内存的指针。

它稍后调用“Parent”函数调用的事实只是完全随机的、未定义的行为。它可以很容易地打印出生命的意义,或者在过去,炸毁你的显示器。:)

评论

0赞 legameeternoforall 8/2/2017
哈哈。。谢谢,我不确定我是否理解生命的意义,但可以肯定的是,我理解了这里的问题。再次感谢。