Полиморфная функция ввода не работает как задумано - PullRequest
0 голосов
/ 19 апреля 2019

Итак, у меня есть этот код:

vehicle *v1=&c;
std::cout<<"Car: "<<endl;
v1->input(cin);

Автомобиль - базовый класс, а Автомобиль - производный. Они оба разделяют виртуальную функцию input. Проблема в том, что всякий раз, когда я вызываю этот метод, программа может заполнять только базовую часть. Вот код для ввода. Для базового класса:

istream& vehicle::input(istream& is) {

    char buffer[100];
    is.getline(buffer,100);
    set_type(buffer);
    is.getline(buffer,100);
    set_brand(buffer);
    is.clear();
    return is;
}

А для автомобиля, производного класса:

istream& car::input(istream& is) {

    vehicle::input(is);
    char buffer[100];
    is.getline(buffer,100);
    set_alim(buffer);
    is.clear();
    return is;
}

Я также попытался удалить вызов vehicle::input(is);, и программа ничего не делает. Предположительно, он не может распознать виртуальный метод. Как мне это исправить?

По требованию:

class vehicle {
friend ostream& operator<<(ostream&, const vehicle&);
friend istream& operator>>(istream&, vehicle&);
protected:
    char* type;
    char* brand;
public:
    //constructors
    void set_type(const char* t) {
        delete [] type;
        type=new char(strlen(t)+1);
        strcpy(type,t);
    }
    void set_brand(const char* t) {
        delete [] brand;
        brand=new char(strlen(t)+1);
        strcpy(brand,t);
    }

    virtual istream& input(istream&);
};

class car:public vehicle {
friend ostream& operator<<(ostream&, const car&);
friend istream& operator>>(istream&, car&);
private:
    char* alim;
public:
    //constructors
    void set_alim(const char* a) {
        delete [] alim;
        alim=new char(strlen(a)+1);
        strcpy(alim,a);
    }

    virtual istream& input(istream&);
};

РЕДАКТИРОВАТЬ: Я нашел ошибку, проблема не в том, чтобы использовать is.ignore(), даже если вы создаете новый проект и создаете код точно так же, как я, он работает просто отлично

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...