我目前正在研究多态性及其与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()
函数呢?
答案 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();
}