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

时间:2019-01-16 01:08:51

标签: c++ inheritance subclass superclass

我写了以下代码:

// 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派生的类的实例,因此我可以将其传递给需要mother类型的对象的函数,即。迎接。我的问题是,是否可以从招呼中调用sayhello函数,以便它会说 它会说“你好,我的名字是特里”而不是“你好,我的名字是克莱尔”。

1 个答案:

答案 0 :(得分:2)

您要的是所谓的“多态行为”(或“动态调度”),它是C ++的基本功能。要启用它,您需要做几件事:

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

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

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