Извикване на родителска функция вътре в дъщерен клас

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. За да извикате версията Parent на read, мисля, че ще трябва да прехвърлите детето си към Parent и след това да извикате read чрез препратка 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