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

标签 c++ inheritance polymorphism

我有一个名为 Athlete 的父类,还有一个名为 TennisPlayer 的子类。我的父类中有两个属性,分别是姓名和年薪。还有一个 read 方法,它接收两个类的用户输入。这是我 parent 的样子:

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++ 中的继承。提前致谢。

最佳答案

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

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

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);

}

附加: 子级可以访问父类的公共(public)和 protected 方面。因此,另一种方法是保护成员变量,以便子类可以访问它们,但它们仍然对外部类隐藏。

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

关于c++ - C++中的继承(父类和子类),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17651691/

相关文章:

c++ - 检查实现了哪些基类

c++ - 找出类(class)及其 child 中的类(class)类型

c++ - 从 C++ 程序更改另一个程序的背景颜色

javascript - 普通对象的原型(prototype)继承可以吗?

c# - 通过强制转换或鸭式输入不同的对象类型来重用相同的功能

java - 接受两种不同类型作为参数的方法

c++ - Visual Studio : question about linking functions between two projects

java - Java中父类函数的访问

java - 为两个扩展 super 的类制作比较器

C++ 连接多态对象的容器