Вызов родительской функции внутри дочернего класса

class Parent;
class Child;

Parent *parent;

ifstream inf("file.csv");
inf >> *parent;

//in parent class
friend istream& operator>> (istream &is, Parent &parent) {
  return parent.read(is);
}

virtual istream& read(istream &is){
  char temp[80];
  is >> temp;
  // then break temp into strings and assign them to values
  return is;
}

//virtual istream& read

Он читает и присваивает только первые два значения родительскому классу. Класс Child имеет Parent значения класса + 3 собственных.

Как я могу вызвать родительскую функцию read(), а затем дочернюю функцию read(), чтобы родительская функция считывала первые 2 поля в файле, а дочерняя считывала следующие 3 поля?

Я знаю, что это вопрос синтаксиса; Я просто не могу понять, как это сделать. Я пытался вызвать Parent::read(is) внутри дочернего класса чтения, я пытался вызвать его перед дочерним read(); Я пробовал read(is) >> temp, но ни один из них не работал. Когда я вызывал Parent::read(is), а затем is >> temp, родительский is возвращал все 5 значений файла.


person user1078719    schedule 04.06.2012    source источник
comment
все ваши a,b,c,d,e,g,df,ds,vd,bn переменные.. это плохой стиль. пожалуйста, напишите что-то вроде этого: in_file (не могу понять, но предположим, что это входной файл) или input_file или inputFile или и т.д...   -  person gaussblurinc    schedule 04.06.2012
comment
IIRC Parent::method() должен работать.   -  person rossum    schedule 04.06.2012
comment
Я думаю, что Parent::method() вызовет только статический метод Parent. Чтобы вызвать родительскую версию чтения, я думаю, вам нужно привести своего ребенка к родителю, а затем вызвать чтение через родительскую ссылку, как в Child c; Parent(c).read() /* should invoke Parent method */; c.read() /* should invoke Child method */;. Я предполагаю здесь, что Child наследует от Parent, хотя объявления в вопросе не указывали на это.   -  person Bob Jarvis - Reinstate Monica    schedule 04.06.2012


Ответы (1)


В такой ситуации у вас обычно есть функция Child, переопределяющая функцию read в Parent. Это позволяет производному классу вызывать исходную функцию в родительском объекте до применения собственной логики.

class Parent
{
public:
    virtual void read(istream &s)
    {
        s >> value1;
        s >> value2;
    }
};

class Child : public Parent
{
public:
    virtual void read(istream &s)
    {
        Parent::read(s);  // Read the values for the parent

        // Read in the 3 values for Child
        s >> value3;
        s >> value4;
        s >> value5;
    }
};

Чтобы выполнить операцию чтения"

// Instantiate an instance of the derived class
Parent *parent(new Child);

// Call the read function. This will call Child::read() which in turn will
// call Parent::read() 
parent->read(instream);
person Captain Obvlious    schedule 05.06.2012