C ++中的继承(父类和子类)

时间:2013-07-15 10:07:55

标签: c++ inheritance polymorphism

我有一个叫做Athlete的父类,还有一个名为TennisPlayer的子类。我父类中有两个属性,即名称和年薪。还有一种读取方法,它接收两个类的用户输入。以下是我父母的样子:

class Athlete
{
public:
    Athlete();
    Athlete(string name, float annual_salary);
    virtual void read();
    virtual void display();
    string get_name() const;
    float get_annual_salary();
    void set_name(string name);
    void set_annual_salary(float annual_salary);
private:
    string name;
    float annual_salary;
};

class TennisPlayer : public Athlete
{
public:
    TennisPlayer();
    TennisPlayer(string name, float annual_salary, int current_world_ranking);
    int get_current_world_ranking();
    void set_current_world_ranking(int current_world_ranking);
    virtual void read();
    virtual void display();
private:
    int current_world_ranking;
};

运动员课程的read()方法非常有效。但是当涉及到儿童类的TennisPlayer时,出现问题,它不会接受用户输入,而是直接询问我当前世界排名的输入。这是我对TennisPlayer类的.cpp:

void TennisPlayer::read()
{
    cout << "Enter name for tennis player: " ;
    getline(cin, get_name());
    cout << "Enter annual salary for tennis player: ";
        cin >> get_annual_salary();
    cout << "Enter current world ranking: ";
    cin >> current_world_ranking;
}

tennisPlayer类的结构:

TennisPlayer::TennisPlayer(string name, float annual_salary ,int current_world_ranking)
: Athlete(name , annual_salary)
{
    this->current_world_ranking = current_world_ranking;
}

在阅读tennisPlayer的年薪时也存在问题。我不太熟悉C ++中的继承。提前谢谢。

2 个答案:

答案 0 :(得分:1)

猜测我会说继承不是你的问题,而是getline。通常,'enter'字符留在输入缓冲区中,这意味着下一个输入行似乎被跳过,因为它只读取该字符。在致电cin.get();之前尝试放getline()以清除这个额外字符。

编辑:让我重构一些代码:

void TennisPlayer::read()
{
    string tennisName;
    float annualSalary;

    cout << "Enter name for tennis player: " ;
    cin.get();  <--read any leftover characters in the input buffer
    getline(cin, tennisName);  <--read in the value
    set_name(tennisName);   <--use parent's mutator to set the value

    cout << "Enter annual salary for tennis player: ";
    cin >> annualSalary;
    set_annual_salary(annualSalary);

}

其他 孩子可以访问父类的公共和受保护的方面。因此,另一种方法是使成员变量受到保护,以便子类可以访问它们,但它们仍然可以从外部类中隐藏。

子类可以从父类调用公共成员变量和函数而不需要范围解析,即无需指定TennisPlayer::set_name,只需set_name就足够了。

答案 1 :(得分:0)

试试这个

void TennisPlayer::read()
{
    cout << "Enter name for tennis player: " ;
    string sName;
    getline(cin, sName);
    set_name( sName );

    cout << "Enter annual salary for tennis player: ";
    float salary;
    cin >> salary;
    set_annual_salary(salary);

    cout << "Enter current world ranking: ";
    int ranking;
    cin >> ranking;
    set_current_world_ranking(ranking);
}

getter函数只返回一个值。更改此值将不会对值所来自的对象执行任何操作。您需要调用setter函数才能实际更改TennisPlayer对象。