新运算符->有或没有

时间:2019-03-21 08:04:37

标签: c++ oop new-operator

客观

试图了解实例化派生类对象的行为差异

我的工作

  1. 创建了一个“人”类
  2. 向“人”类添加了一个虚拟方法,该方法将值设置为变量 name
  3. 定义了基类“人”派生的“雇员”类
  4. 为“员工”类添加了一种方法,该方法将值设置为最初在基类中定义的变量 name ,但在其后添加了“さん”后缀。
  5. 创建了不同的类型或初始化,并测试了输出之间的差异

定义的类

  

我创建了一个基类“人”和一个派生类“雇员”,如下所示:

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的行为不同,即使它们似乎都具有相似的启动。

请帮助!

1 个答案:

答案 0 :(得分:2)

使用

person extraPerson1 = employee();

employee对象slice变成person对象。对象extraPerson1person对象,而不是employee对象。当您调用其setName函数时,您正在调用person::setName

多态和虚函数仅在具有 pointers references 的情况下起作用。