c++ i klasa abstrakcyjna

0

hej, mam problem z ponizszym programikiem :

class NapisBazowy
{
public :
virtual void napis (void) ;
} ;
class NapisPochodny1 : public NapisBazowy
{
public :
void napis (void) ;
} ;
void NapisPochodny1::napis (void)
{
cout << "pochodny 1" << endl ;
}
class NapisPochodny2 : public NapisBazowy
{
public :
void napis (void) ;
} ;
void NapisPochodny2::napis (void)
{
cout << "pochodny 2" << endl ;
}

    list <NapisBazowy> Lista ;
    list <NapisBazowy>::iterator i ;

    NapisPochodny1 B ;
    NapisPochodny2 C ;

    Lista.push_back (B) ;
    Lista.push_back (C) ;        
    i = Lista.begin() ;
    while ( i != Lista.end())
    {
            
            i->napis() ;
            i++ ;
    }

w zalozeniu wynikiem dzialania programu mialy byc napisy :
pochodny 1
pochodny 2
zamiast tego otrzymuje
[Linker Error] Unresolved external 'NapisBazowy::napis()' referenced from D:_P\PROG.OBJ
co robie nie tak?

0

hmmmm może jak byś w klasie głównej Od razu napisał:
virtual void napis (void)
{
}
to może by pomogło ale nie wiem bo nie próbowałem.

0

hmmmm może jak byś w klasie głównej Od razu napisał:
virtual void napis (void)
{
}
to może by pomogło ale nie wiem bo nie próbowałem.

Tak jest ok, tyle ze bez slowa "virtual". Ale lepiej napisac w deklaracji w klasie bazowej:

virtual void napis(void) = 0;
0

Tak jest ok, tyle ze bez slowa "virtual".

Jak nie będzie "virtual" to funkcja nie zostanie potraktowana jako wirtualna (to jest kod, który miał być "w klasie")!!

virtual void napis(void) = 0;

A to jest funkcja czysto wirtualna ("pure virtual") i tak się właśnie powinno to zrobić.

0

Masz racje, nie zauwazylem.

0

wpierw dziekuje wszystkim za odpowiedz!
zrobilem tak, jak pisaliscie ale to nie moze dzialac ;)
bo nie mozna tworzyc obiektow klasy abstrakcyjnej :
class NapisBazowy {
public :
virtual void napis(void) = 0;
} ;
class NapisPochodny1 : public NapisBazowy {
public :
virtual void napis (void) ;
} ;
void NapisPochodny1::napis (void) {
cout << "pochodny 1" << endl ;
}
class NapisPochodny2 : public NapisBazowy{
public :
virtual void napis (void) ;
} ;
void NapisPochodny2::napis (void){
cout << "pochodny 2" << endl ;
}
zas w "main" :
list <NapisBazowy> Lista ; // takie cos jest niemozliwe?
list <NapisBazowy>::iterator i ;
NapisPochodny1 B ;
NapisPochodny2 C ;

    Lista.push_back (B) ;
    Lista.push_back (C) ;
    i = Lista.begin() ;

    while ( i != Lista.end())  {
            i->napis() ; // chce zeby "napis()" wywolal sie dla B i C
            i++ ;
    }

za to dziala takie cos :

class NapisBazowy{
public :
virtual void napis(void) = 0;
NapisBazowy *next ;
} ;
class NapisPochodny1 : public NapisBazowy{
public :
virtual void napis (void) ;
} ;
void NapisPochodny1::napis (void){
cout << "pochodny 1" << endl ;
}
class NapisPochodny2 : public NapisBazowy{
public :
virtual void napis (void) ;
} ;
void NapisPochodny2::napis (void){
cout << "pochodny 2" << endl ;
}

a w "main" :

    NapisBazowy *ptr ;

    NapisPochodny1 B ;
    NapisPochodny2 C ;

    ptr = &B ;
    ptr->napis() ;
    ptr->next = &C ;
    ptr = ptr->next ;
    ptr->napis() ;

to daje w wyniku wywolanie metod z klas pochodnych ...
nie da sie osiagnac tego przy pomocy list<NapisBazowy> ?

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