Funkcje wirtualne - użycie

0
#include <iostream>
#include <string.h>
 
using namespace std;
 
class Tekst{
private:
string _t;
 
 
public:
void wpisz(string a){a=_t;}
virtual string pobierz(){return _t;}
 
};
 
class Haslo:public Tekst
{
        virtual string pobierz(){return "***";}
};
 
 
int main()
{
        Tekst T;
        Haslo H;
 
Tekst *wsk;
string a;
cin>>a;
T.wpisz(a);
H.wpisz(a);
int i;
cin>>i;
if(i==1)
{
        wsk=&T;
        wsk->pobierz();
}
else
{
        wsk=&H;
        wsk->pobierz();
}
 
cin.get();
 return 0;
}

Posiadam taki oto kod, ale nie do końca czuję funkcje wirtualne. Zasada działania jest taka -> użytkownik wpisuje string, ten leci zarówno do klasy Tekst oraz Hasło, i teraz w zależności czy użytkownik wpisze 1 czy nie chciałbym wywołać odpowiednią funkcję z odpowiedniej klasy. Jednak jak napisałem nie do końca rozumiem funkcje wirtualne oraz w jaki sposób miałyby mi pomóc np. w późniejszym rozwijaniu kodu.

1

Najprostszy przykład: do jednej tablicy (lub innego kontenera) pakujesz obiekty różnego typu.
Po czym jedną pętlą roisz na nich pewną operację no choćby zwolnienie.
Przykład: Program graficzny, lista obiektów na warstwie, jedną pętlą wymuszamy rysowanie bo metoda rysuj() jest wirtualna.

0

Średnio trafia do mnie powyższy przykład, mój kod nadal nie działa tak jakbym tego chciał. Jedyne co wyłapałem to to, że w potomku nie dałem public. Zmieniłem to oraz sposób wysyłania stringa podanego przez użytkownika ale nadal nie działa.

#include <iostream>
#include <string.h>

using namespace std;

class Tekst{
private:
string _t;


public:
void wpisz(string a){a=_t;}
virtual string pobierz(){return _t;}

};

class Haslo:public Tekst
{
public:
	virtual string pobierz(){return "***";}
};


int main()
{
	Tekst T;
	Haslo H;

Tekst *wsk;
string a;
cin>>a;
wsk=&T;
wsk->wpisz(a);
wsk=&H;
wsk->wpisz(a);

int i;
cin>>i;
if(i==1)
{
	wsk=&T;
	wsk->pobierz();
	cin.get();
}
else
{
	wsk=&H;
	wsk->pobierz();
	cin.get();
}

cin.get();
 return 0;
}
0
  1. Nie napisałeś jak chcesz aby działał a z tego kodu to nie wynika.
  2. Poczytaj o formatowaniu kodu, niektóry rzeczy stają się od razu jaśniejsze kiedy patrzysz na porządnie sformatowany kod.
0

W pierwszym poście napisałem: Zasada działania jest taka -> użytkownik wpisuje string, ten leci zarówno do klasy Tekst oraz Hasło, i teraz w zależności czy użytkownik wpisze 1 czy nie chciałbym wywołać odpowiednią funkcję z odpowiedniej klasy.
Czyli w zależności od wpisanej liczby albo zwraca *** albo tą liczbę.

0

Zdecydowanie za wcześnie zabrałeś się za funkcje wirtualne, najpierw ogarnij podstawy.

#include <iostream>
#include <string>
using namespace std;

class Tekst
  {
   private:
   string _t;
   public:
   void wpisz(const string &t) { _t=t; }
   virtual string pobierz()const { return _t; }
  };

class Haslo:public Tekst
  {
   public:
   virtual string pobierz()const { return "***"; }
  };


int main()
  {
   Tekst T;
   Haslo H;
   Tekst *Tb[]={&H,&T};

   string a;
   cin>>a;
   for(int i=0;i<2;++i) Tb[i]->wpisz(a);
   
   for(int i=0;i<2;++i) cout<<'"'<<Tb[i]->pobierz()<<'"'<<endl;
   return 0;
  }
0

Trochę się nie zrozumieliśmy nie chodziło mi o wpisanie i wypisanie obydwu funkcji tylko od tego czy użytkownik wpisze 1 czy też inną liczbę wykonana zostanie funkcja z ojca lub z potomka.

0

Może jakieś podstawy najpierw łyknij, bo nie mamy jak rozmawiać:

cout<<'"'<<Tb[i]->pobierz()<<'"'<<endl;

Jak dla mnie nie ma znaczenia czy to i zostało wczytane przez cin czy też jest zmienną iteracyjną pętli. Dla ciebie to wielka różnica, więc zacznij od podstaw.

0

No wybacz wiem jak działa for, jedyne czego nie rozumiem to dlaczego u Ciebie to działa: Tekst *Tb[]={&H,&T}; a u mnie w ifie nie działa i wybacz ale nie koniecznie muszę pisać fora do wpisania 2 elementów.

0

Działa z if'ami też, z tym że jak już powiedziałem nawet kilkakrotnie - za wcześnie tobie tym się zajmować, masz zaniedbane podstawy:

void wpisz(string a){a=_t;} // WTF ?
0

Nie wiem co Ci się tutaj nie podoba, z resztą akurat to mam z książki. Zwykłe przesłanie stringu wpisanego przez użytkownika do funkcji która przypisuje go do stringa zadeklarowanego w klasie. Co w tym złego ?

1
clz napisał(a):

Co w tym złego ?
To że brakuje ci podstawowych podstaw. Nie wiesz nawet w którą stronę następuje przepisanie. Ba nawet z książki przepisać nie umiesz.

0

Mój błąd, dopiero teraz zauważyłem, dziękuję za pomoc. Z ksiązki nie przepisuje toćka w toćkę tylko próbuję sam pisać. Pozdrawiam

1 użytkowników online, w tym zalogowanych: 0, gości: 1