Итак, у меня есть этот код:
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()
, даже если вы создаете новый проект и создаете код точно так же, как я, он работает просто отлично