我写了以下代码:
// 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函数,以便它会说 它会说“你好,我的名字是特里”而不是“你好,我的名字是克莱尔”。
答案 0 :(得分:2)
您要的是所谓的“多态行为”(或“动态调度”),它是C ++的基本功能。要启用它,您需要做几件事:
使用sayhello()
关键字(即virtual
而不只是virtual void sayhello()
)标记void sayhello()
方法
将greet()
方法的参数更改为按引用传递或按指针传递,以避免对象切片问题(即,int greet(const Mother & m)
而非int greet(Mother m)
)< / p>
完成此操作后,编译器将根据sayhello()
参数的实际对象类型,智能地选择在运行时调用哪个m
方法,而不是硬编码该选择在编译时根据greet
函数的arguments-list中明确列出的类型。