|
![]() |
#1 |
Registered User
Datum registracije: Jul 2009
Lokacija: Srbija
Postovi: 8
|
Nasledjivanje i konstruktori u C++
Zasto ovaj programcic nece da se iskompajlira? Prijavljuje da je problem u konstruktoru Casopis, ali zbog cega? I kako prepraviti program da ovo radi? Znaci, hocu da klasa Casopis nasledi klasu Publikacija, redefinise metodu ispis() klase Publikacija, zatim da u toku izvrsavanja (dakle, dinamicki), na osnovu korisnickog zahtjeva se pozove metoda ispis() ili iz Publikacije ili iz klase Casopis. Naizgled, prosta stvar, nasledjivanje, konstruktori, inicijalizacije, ali.... Kada postojece konstruktore zamjenim default konstruktorima (tj. onim bez parametara), to ce sve da radi, incijalizacija ce se obaviti. Medjutim, sta ako hocu da napravim 15 objekata neke klase, pa nece svi imati default vrijednosti...treba nekad da se inicijalizuju i drugacijim vrijednostima od default-nih. Dakle, evo koda: ========================================================= #include<iostream> using namespace std; class Publikacija{ private: int a1; public: Publikacija(int a){ a1 = a; } void ispis(){ cout <<"\n\ta1: "<<a1 <<endl; } }; class Casopis: public Publikacija{ private: int a1; public: Casopis(int a){ a1 = a; } void ispis(){ cout <<"\na1: "<<a1 <<endl; } }; void ispisi_sve(Publikacija *p){ p->ispis(); cout<<endl; } main(){ Publikacija *p; string izbor; Publikacija objekat1(438); Casopis objekat2(212); cout <<"\nIz koje klase da pozovem metod ispis()? "; cin >> izbor; if(izbor == "publikacija") {p = &objekat1; ispisi_sve(p); } else {p = &objekat2; ispisi_sve(p);} } ========================================================= Hvala. |
![]() |
![]() |
![]() |
#2 |
Registered User
Datum registracije: Jun 2007
Lokacija: cro
Postovi: 42
|
evo probaj ovo,trebalo bi raditi bez problema... Code:
#include <iostream> #include <string> using namespace std; class Publikacija { int a1; public: Publikacija() {} Publikacija(int a){a1 = a;} void ispis(){cout <<"\n\ta1: "<<a1<<endl;} }; class Casopis: public Publikacija { int a1; public: Casopis(int a){a1 = a;} void ispis(){cout <<"\na1: "<<a1<<endl;} }; void ispisi_sve(Publikacija *p) { p->ispis(); cout<<endl; } int main(){ Publikacija *p; string izbor; Publikacija objekat1(438); Casopis objekat2(212); cout <<"\nIz koje klase da pozovem metod ispis()? "; cin >> izbor; if(izbor == "publikacija") { p = &objekat1; ispisi_sve(p); } else { p = &objekat2; ispisi_sve(p); } return 0; } |
![]() |
![]() |
|
|
Oglas
|
|
![]() |
#3 |
Registered User
Datum registracije: Jul 2009
Lokacija: Srbija
Postovi: 8
|
Kod se iskompajlira fino, bez greske. Medjutim, ovo ne radi dobro kad se pokrene. Izgleda da uvijek kad se pravi objekat u C++-u mora ovako da se radi: Publikacija p = new Publikacija(); Tako nesto, uglavnom treba dinamicki dodjeliti memoriju za objekat, a zatim adresu tog mem. prostora smjestiti u pokazivac p. I jos nesto...ispred prve funkcije ispis() treba staviti "virtual".... |
![]() |
![]() |
![]() |
#4 |
Registered User
Datum registracije: Jun 2007
Lokacija: cro
Postovi: 42
|
eh da, posto radimo redefiniciju clana base klase ta se funkcija stoga mora deklarirati kao virtualna,treba samo dodati virtual ispred funkcije ispis()... pocetnicka greska ![]() ali nisam za svojim kompom i bez VSC++ ![]() |
![]() |
![]() |
|
|
Oglas
|
|
![]() |
|
|