cpp从需要超类对象的函数访问子类对象方法

cpp access subclass object methods from function that requires superclass object

我写了下面的代码:

// constructors and derived classes
#include <iostream>
using namespace std;

class Mother
{
  public:
    int age;
    Mother()
    {
        cout << "Mother: no parameters: \n"
             << this->age << endl;
    }
    Mother(int a)
    {
        this->age = a;
    }
    void sayhello()
    {
        cout << "hello my name is clair";
    }
};

class Daughter : public Mother
{
  public:
    int age;
    Daughter(int a)
    {
        this->age = a * 2;
    };
    void sayhello()
    {
        cout << "hello my name is terry";
    }
};

int greet(Mother m)
{
    m.sayhello();
}

int main()
{
    Daughter kelly(1);
    Son bud(2);
    greet(kelly);
}

我的问题是: 因为 kelly 是从 Mother 派生的 class 的实例,所以我可以将它传递给需要 mother 类型对象的函数,即。迎接。我的问题是,是否可以从 greet 中调用 sayhello 函数,这样它会说 它会说 "hello my name is terry" 而不是 "hello my name is clair"。

你要的是"polymorphic behavior"(或"dynamic dispatch"),它是C++的一个基本特性。要启用它,您需要做几件事:

  1. 使用 virtual 关键字标记您的 sayhello() 方法(即 virtual void sayhello() 而不仅仅是 void sayhello()

  2. greet() 方法的参数更改为按引用传递或按指针传递,以避免对象切片问题(即 int greet(const Mother & m) 而不是 int greet(Mother m))

完成后,编译器将根据 m 参数的实际对象类型,智能地选择在 运行 时调用哪个 sayhello() 方法,而不是而不是在编译时根据 greet 函数的参数列表中明确列出的类型对选择进行硬编码。