通过引用传递C ++,指针向量。这里发生了什么?

时间:2017-08-01 22:08:59

标签: c++ pointers vector pass-by-reference

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

在这个例子中(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)

由于

1 个答案:

答案 0 :(得分:1)

一些事情...你的标题表明你是“通过参考传递”。你实际上正在传递“By Pointer”。

此外,当您致电

ABC::test(&c1);

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

但......当你打电话时

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

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

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

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