指针重新分配和多态

时间:2018-12-27 03:52:51

标签: c++ pointers inheritance memory polymorphism

我目前正在研究多态性及其与C ++中的指针的关系。虽然我了解静态分配和动态分配与多态性之间的关系,但有一种情况使我感到困惑。

p1 passed
p2 not passed

我不明白的是为什么class Human { public: virtual void talk(); }; void Human::talk(){ cout << "oink oink" << endl; } class Doctor : public Human { public: virtual void talk(); }; void Doctor::talk(){ cout << "ouaf ouaf" << endl; } int main(int argc, char const *argv[]) { Human h = Doctor(); Human* p = new Doctor(); delete p; p = &h; p->talk(); } 输出p->speak()而不是oink oink。是因为p被重新分配到了堆栈上而不是堆上的某个位置?如果p可以重新分配,为什么不只指向ouaf ouaf的地址并决定在运行时调用h中的talk()函数呢?

1 个答案:

答案 0 :(得分:2)

第一行人类h = Doctor();首先创建h,然后创建Doctor对象,然后调用human的复制构造函数。 H被声明为人类,因此在复制构造后它将保持人类状态。

#include <iostream>

using namespace std;

class Human
{
    public:
        virtual void talk();
        Human()
        {
            cout<<"Human"<<endl;
        }
        Human(const Human & h)
        {
            cout<<"Copy Human"<<endl;
        }
};

void Human::talk(){ cout << "oink oink" << endl; }

class Doctor : public Human
{
    public:
        virtual void talk();
        Doctor()
        {
            cout<<"Doctor"<<endl;
        }
        Doctor(const Human & h)
        {
            cout<<"Copy Doctor"<<endl;
        }
};

void Doctor::talk(){ cout << "ouaf ouaf" << endl; }


int main(int argc, char const *argv[])
{
    Human h = Doctor();
    Human* p = new Doctor();

    delete p;
    p = &h;
    p->talk();

}