我正在使用演示多态性的子类进行赋值。该程序需要为每个新对象指定一个名称。我只应该有字符串getName(){return name;} (这位于基类中)。每个类 class(string){} 中还有一个构造函数。在main函数中,我想为每个对象设置名称。我应该如何理解任何建议!
h file:
#ifndef DUCK_H
#define DUCK_H
#include <string>
using namespace std;
class Duck
{
private:
string name;
public:
Duck(){}
Duck(string){}
string getName() { return name; };
virtual string quack() {return "Which"; }
virtual string fly() { return "How?"; }
};
class RubberDuck : public Duck
{
public:
RubberDuck(){}
RubberDuck(string) {}
string quack() { return "Squeak"; }
string fly() { return "Fly with bounce"; }
};
class MallardDuck : public Duck
{
public:
MallardDuck(){}
MallardDuck(string) {}
string quack() { return "Quack"; }
string fly() { return "Fly with wings"; }
};
class RocketDuck : public Duck
{
public:
RocketDuck(){}
RocketDuck(string) {}
string quack() { return "Zoom"; }
string fly() { return "Fly with rockets"; }
};
#endif // !1
cpp文件:
#include <iostream>
#include "Duck.h"
using namespace std;
//void display(Duck *d);
int main()
{
Duck d1;
MallardDuck md;
RubberDuck rbd;
RocketDuck rd;
//for main duck
//Duck duck("Donald");
//cout << duck.getName();
cout << d1.quack() <<"\n";
cout << d1.fly() <<"\n";
cout << "\n";
//for rubber duck
RubberDuck rbdname("Rubby");
cout << rbd.quack() << "\n";
cout << rbd.fly() << "\n";
cout << "\n";
//for mallard duck
MallardDuck mdname("Mally");
cout << md.quack() << "\n";
cout << md.fly() << "\n";
cout << "\n";
// for rocket duck
RocketDuck rdname("Rocky");
cout << rd.quack() << "\n";
cout << rd.fly() << "\n";
cout << "\n";
//polymorphism
Duck *d2 = new MallardDuck();
cout << d2->getName() << "\n";
cout << d2->quack() << "\n";
cout << d2->fly() << "\n";
cout << "\n";
return 0;
}
/*void display(Duck d)
{
cout << d.quack();
}
*/
答案 0 :(得分:0)
您是否在询问如何调用您定义的构造函数?你会这样做
Duck duck("Drake Mallard");
答案 1 :(得分:0)
使用此代码:
Duck(){}
Duck(string){}
您无法初始化您的成员name
,无论您是调用默认构造函数还是string
。
您必须使用输入参数,就像我向您展示的那样:
Duck(string const & input_name) : name(input_name) {}
^^^^^^^^^^^^^^^^
当您执行以下操作时,带下划线的部分会将您的成员name
初始化为值"Drake Mallard"
:
Duck duck("Drake Mallard");
然后,您将duck.getName()
返回"Drake Mallard"
。
你必须在派生类中应用相同的原则,才能调用这个相同的基本构造函数:
class RubberDuck : public Duck
{
public:
RubberDuck() : Duck("RubberDuck") {}
RubberDuck(string const & input_name) : Duck(input_name) {}
然后
RubberDuck rubber; // name = "RubberDuck"
RubberDuck rubber("Ruber"); // name = "Rubber"
但是:
RubberDuck * rubber = new RubberDuck(); // name = "RubberDuck"
RubberDuck * rubber = new RubberDuck("Ruber"); // name = "Rubber"
如果您提问,我的评论中的前面部分Duck::
会考虑您在class Duck { ... };
之外实施构造函数的位置。
您应该避免使用using namespace
,尤其是在标题内。