调用实际对象的方法而不是父类

时间:2017-11-16 04:20:56

标签: c++ c++11

我有以下虚拟代码:

 #include <iostream>
 #include <vector>

 using namespace std;

 class Parent {
 public:
     void printHello() {
         cout << "Hello Parent" << endl;
     }
 };

 class Child : public Parent {
 public:
     void printHello() {
         cout << "Hello Child" << endl;
     }
 };


 int main() {
     vector<Parent*> list;
     Child child;
     list.push_back(&child);

     list[0]->printHello();
  }

  Output: Hello Parent

我正在尝试创建从父类派生的类的对象列表。迭代它们并运行一个方法,它们都继承并覆盖。

我假设子类中的方法会覆盖父类中的方法。

我也尝试过使用vector<Parent>代替vector<Parent*>的方法。

结果是一样的。如何调用派生类的方法而不是父类?

3 个答案:

答案 0 :(得分:5)

使用虚拟方法 - http://en.cppreference.com/w/cpp/language/virtual。详细了解他们here

#include <iostream>
#include <vector>

class Parent {
public:
    // using virtual keyword
    virtual ~Parent() = default;
    virtual void printHello() const { std::cout << "Hello Parent" << std::endl; }
};

class Child : public Parent {
public:
    // using override keyword though its not necessary
    void printHello() const override { std::cout << "Hello Child" << std::endl; }
};


int main()
{
    std::vector<Parent *> list;
    Child child;
    list.push_back(&child);

    list[0]->printHello();
}

Output -

  

Hello Child

答案 1 :(得分:4)

在C ++中,您必须在父类方法定义中使用虚拟来指定您将使用多态方法。 C ++中的默认行为不是多面的。

#include <iostream>
#include <vector>

using namespace std;

class Parent {
public:
    virtual void printHello() {
        cout << "Hello Parent" << endl;
    }
};

class Child : public Parent {
public:
    void printHello() {
        cout << "Hello Child" << endl;
    }
};

查看此信息以获取更多信息:Polymorphism in C++

答案 2 :(得分:0)

要获得所需的行为,需要在父类中声明该方法virtual。有关详细信息,请参阅http://en.cppreference.com/w/cpp/language/virtual