试图了解实例化派生类对象的行为差异
我创建了一个基类“人”和一个派生类“雇员”,如下所示:
人
class person
{
protected:
string name;
public:
person();
~person();
virtual void setName(string myName)
{
name = myName;
}
};
员工
class employee : public person
{
public:
employee();
~employee();
void setName(string myName)
{
name = myName+"さん";
}
};
int main()
{
person newPerson = person();
employee anotherPerson1 = employee();
employee* anotherPerson2 = new employee();
person extraPerson1 = employee();
person* extraPerson2 = new employee();
newPerson.setName("new");
anotherPerson1.setName("another1");
anotherPerson2->setName("another2");
extraPerson1.setName("extra1");
extraPerson2->setName("extra2");
cout << newPerson.getName() << endl;
cout << anotherPerson1.getName() << endl;
cout << anotherPerson2->getName() << endl;
cout << extraPerson1.getName() << endl;
cout << extraPerson2->getName();
}
new
another1さん
another2さん
extra1
extra2さん
我了解newPerson,anotherPerson1和anotherPerson2的行为。
我无法理解为什么extraPerson1和extraPerson2的行为不同,即使它们似乎都具有相似的启动。
请帮助!
答案 0 :(得分:2)
使用
person extraPerson1 = employee();
将employee
对象slice变成person
对象。对象extraPerson1
是person
对象,而不是employee
对象。当您调用其setName
函数时,您正在调用person::setName
。
多态和虚函数仅在具有 pointers 或 references 的情况下起作用。