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

Calling methods of actual object instead of parent class

本文关键字:父类 方法 对象 调用      更新时间:2023-10-16

我有以下虚拟代码:

 #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*> 的方法。

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

使用虚拟方法 - http://en.cppreference.com/w/cpp/language/virtual。在此处阅读有关它们的更多信息。

#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();
}

输出 -

你好孩子

在C++中,您必须在父类方法定义中使用 virtual 来指定您将使用多调方法。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;
    }
};

查看此内容以获取更多信息: C++中的多态性

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