为什么使用value赋值时指针不会出现相同的结果使用地址?

时间:2015-06-16 18:41:02

标签: c++

为什么第一个语句ptr-> show()显示基数,尽管我指定* ptr = dv1 但第二个声明ptr-> show()显示Derv2我预计首先显示Derv1和两个显示Derv2

class Base {

    public:

    virtual void show() 

    {

    cout << "Base\n";
    }
 };


class Derv1 : public Base //derived class 1
{

  public:

    void show()
    {
        cout << "Derv1\n";
    }
};

class Derv2 : public Base 
{
  public:
    void show()
    {
        cout << "Derv2\n";
    }
};

int main()
{
  Derv1 dv1; //object of derived class 1
  Derv2 dv2; //object of derived class 2
  Base* ptr = new Base(); //pointer to base class
  *ptr = dv1; //put value of dv1 in pointer
  ptr->show(); //execute show()
  ptr = &dv2; //put address of dv2 in pointer
  ptr->show(); //execute show()
  return 0;
}

2 个答案:

答案 0 :(得分:0)

Windows.Phone.UI.Input.HardwareButtons.BackPressed += HardwareButtons_BackPressed;

此代码会从*ptr = dv1; //put address of dv1 in pointer创建Base的副本,并复制到仍为[{1}}类型的dv1

ptr

此代码告诉Base指向ptr = &dv2; //put address of dv2 in pointer的地址,ptrdv2类型的对象。由于Derv2是虚拟的,因此它正确调用了Base::show的{​​{1}}实现。

答案 1 :(得分:0)

声明*ptr = dv1表示Derv1课程将被投放到base课程,从而输出&#39; base&#39;

这是因为*ptr取消引用指针并有效地说base &。因此,Derv1类可以轻松地转换为base &,因为它继承了base

的类

然而,ptr = &dv2意味着它将指向dv2的内存地址,因此,当调用该函数时,它将来自dv2,从而输出&#39}。 Derv2&#39;