Visualizzazione dei risultati da 1 a 5 su 5
  1. #1

    [C++] problema con ld e funzioni virtuali

    Salve ragazzi, ho un problemino. Studiando il C++ su un libro ho visto che le funzioni virtuali, oltre a permettere il polimorfismo, danno la possibilità di dichiarare nella classe base una funzione però di definirla solo nelle classi derivate. Per esempio:

    codice:
    #include <iostream>
    
    using namespace std;
    
    class base
    {
     public:
      virtual void prova(void);
    };
    
    class derivata : public base
    {
     public:
      void prova(void){ cout << "Ciao" << endl; }
    };
    
    int main()
    {
     base* temp= new derivata;
     temp->prova();
    
     return 0;
    }
    Insomma secondo il libro è giusto e neanche il compilatore si oppone. Il problema è dato dal linker ld (sono su ubuntu):

    codice:
    alessio@linux:~/Desktop$ g++ Sorgente\ C++.cpp
    /tmp/ccU3vyVz.o: In function `base::base()':
    Sorgente C++.cpp:(.text._ZN4baseC2Ev[base::base()]+0x8): undefined reference to `vtable for base'
    /tmp/ccU3vyVz.o:(.rodata._ZTI8derivata[typeinfo for derivata]+0x8): undefined reference to `typeinfo for base'
    collect2: ld returned 1 exit status
    Qualcuno potrebbe illuminarmi? Vi preeeeeeeeeeego!! :)

  2. #2

    ..

    Ah.. Ho dimenticato di dire che nel main sfrutto il polimorfismo e che una soluzione potrebbe essere quella di modificare la classe base semplicemente sostituendo

    codice:
    virtual void prova(void);
    con


    codice:
    virtual void prova(void) {};
    ovvero assegnando un corpo nullo alla funzione nella classe base. Ma così non cambia il concetto? Cioè in questo modo stiamo definendo il metodo e quindi non dichiarandolo! Penso che così si sfrutti solamente la "precedenza"..

  3. #3
    Se nella classe non definisci un metodo virtuale devi dichiararlo come virtuale puro
    codice:
    virtual void prova(void)=0;
    , altrimenti il compilatore si segna che deve essere definito da qualche parte, il linker non trova la definizione e ti dà quell'errore.
    Naturalmente il tentativo di richiamare un metodo virtuale su un oggetto che non implementa tale metodo risulterà in un errore (pure virtual function call) e (salvo casi eccezionali) in un crash del programma.
    Amaro C++, il gusto pieno dell'undefined behavior.

  4. #4
    Utente di HTML.it L'avatar di Stoicenko
    Registrato dal
    Feb 2004
    Messaggi
    2,254
    o con un = 0 al posto delle parentesi graffe.. dovrebbe bastare

  5. #5

    [RISOLTO] [C++] problema con ld e funzioni virtuali

    Grazie MItaly e Stoicenko. Proprio in questo momento parlando con un amico, ero arrivato a questa conclusione: seguendo tra l'altro l'esempio del libro che non rende virtuale puro il metodo, stavo cercando appunto di seguire l'esempio per dare la possibilità di istanziare comunque un oggetto della classe base, cosa che con un metodo virtuale puro non si può fare (classe astratta).. MA, PENSANDOCI BENE, CHE SENSO HA CREARE UNA CLASSE CON UNA FUNZIONE VIRTUALE DICHIARATA MA NON DEFINITA NON RENDENDOLA PURA PER PERMETTERE DI ISTANZIARLA QUANDO, ISTANZIANDOLA, L'OGGETTO POSSIEDE UN METODO "IGNOTO"?? Si sta parlando cioè di classe astratta comunque!! Ahahah

    Grazie ancora MItaly e Stoicenko per la tempestiva risposta!!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.