Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 13
  1. #1

    [c++] overriding dei costruttori;chiarimenti

    ciao ragazzi avrei bisogno di un aiuto:
    potreste scrivermi un esempio di overriding di costruttori che è un argomento che non riesco ad inquadrare bene?????????

    sul mio libro ad esempio c'è questo:

    class vettore{
    private:
    int dimensione;
    public:
    vettore(int n);
    };

    class vettoreinteriublic vettore{
    int *p;
    public:
    vettoreinteri(int n);
    };
    vettore::vettore(int n)
    {
    dimensione=n;
    }

    vettoreinteri::vettoreinteri(int n):vettore(n)
    {
    p=new int[n];
    }


    in questo caso mi viene detto che il costruttore vettore interi esegue l'overriding del costruttore vettore.
    Non capisco:
    perchè si parli di overriding se i costruttori hanno nomi diversi
    cioè' al momento della creazione con la dicitura
    vettoreinteri a;(per esempio)
    non chiamo il costruttore vettoreinteri???????? è logico che no mi riferisco a "vettore" ; che bisogno ho di scrivere
    "vettoreinteri::vettoreinteri(int n):vettore(n)" ????????????

    mi sa che non ho minimamente colto il concetto, attendo delucidazioni...
    grazie mille

  2. #2
    help

  3. #3
    Utente di HTML.it
    Registrato dal
    Mar 2006
    Messaggi
    118
    Carissimo Pablo;

    il problema è piuttosto complicato,Secondo me, l'overriding e/o l'overload dei costruttori in c++ si basa sul concetto di utilizzare o non utilizzare il costruttore ereditato semplicemente dichiarando o non dicharando un nuovo costruttore anche nella classe figlia.Anche perchè in C++ i costruttori non possono essere dichiarati come funzioni virtuali nella classe base, è già questa regola la dice tutta. Forse il compilatore utilizzato dall'autore del tuo libro non utilizza lo standard ANSI, perchè mi sembra di aver visto utilizzare questa sintassi negli esempi del compilatore della Borland.

    Non voglio perdermi in chiacchere inutili, faccio altri tentativi eppoi ti dò un responso.

  4. #4
    attendo con ansia il tuo responso allora
    grazie mille per l'attenzione

  5. #5
    Utente di HTML.it
    Registrato dal
    Mar 2006
    Messaggi
    118
    Ciao Pablo;

    Per quanto riguarda la sintassi di implementazione dell'override del costruttore è esatta,
    infatti fino a quando non dichiari un oggetto della classe "vettoreintero" il compilatore non
    dà errori.
    Il problema è semplice, il compilatore ci segnale un errore perchè il costruttore ereditato dalla super classe 'vettore', dev'essere
    implementato nella classe base.

    Ecco la soluzione:




    #include <iostream.h>
    #include <conio.h>




    class vettore
    {
    int dimensione;

    public:

    vettore(int n){/* */} //Il costruttore viene falsamente implementato
    };

    class vettoreintero: public vettore
    {
    int *p;
    public:

    vettoreintero(int n);

    };

    vettoreintero::vettoreintero(int n)
    :vettore(n)
    {
    p = new int[n];
    }

    void main()
    {
    vettore ob(4);


    while(!kbhit());
    }



    Originariamente inviato da pablo1986
    attendo con ansia il tuo responso allora
    grazie mille per l'attenzione
    Di nulla, sempre a disposizione.

  6. #6
    [B]

    #include <iostream.h>
    #include <conio.h>

    vettore(int n){/* */} //Il costruttore viene falsamente implementato
    while(!kbhit());
    }
    non capisco queste diciture....

  7. #7
    ora,sempre inerente a questo argomento sto provando a capire coma mai con questo codice:

    /*provaclass.h*/
    class vettore
    {
    public:
    float numero;
    vettore(int n);
    vettore();
    };
    class vettoreinteriublic vettore
    {
    int ciao;
    };

    /*programma*/

    #include<iostream.h>
    #include<conio.h>
    #include "provaclass.h"
    vettore::vettore(int n)
    {
    numero=(20+n);
    }
    vettore::vettore()
    {
    numero=100;
    }

    main()
    {
    vettoreinteri vett;
    cout<< "Il valore di numero vale: "<<vett.numero<<endl;
    getch();
    return(0);
    }

    compliando ed eseguendo questo codice non mi viene segnalato nessun errore e il costruttore chiamato è giustamente vettore di default.
    E fino qua tutto ok.
    Ma se invece di
    "vettoreinteri vett;" nel main metto "vettoreinteri vett(5)" mi da errore mentre io mi attendo che chiami il costruttore "vettore(int n)"
    come mai???????

  8. #8
    Utente di HTML.it
    Registrato dal
    Mar 2006
    Messaggi
    118
    Originariamente inviato da pablo1986
    non capisco queste diciture....
    Scusami.

    Purtroppo i file header "iostream.h" e "conio.h" li ho usati personalmente nell'utilizzo del mio programma C++.

    L'iterazione con la funzione "kbhit" serve a non far chiudere immediatamente la console. Purtroppo il compilatore appena esegue tutte le istruzioni chiude immediatamente il programma.
    Il ciclo while termina fina a quando non viene premuto un tasto, e cioè fino a quando la funzione kbhit non restituisca un flag diverso da zero.

    vettore(int n){/* */} //Il costruttore viene falsamente implementato

    Questa dicitura ha risolto il tuo problema che avevi overridando il costruttore ereditato.
    In costruttore non è una funzione virtuale e come tutte le funzioni non virtuali non può essere anche una funzione astratta.
    In tutti i linguaggi a oggetti solo le funzioni virtuali possono essere astratte, per essere tali non basta solo dichararne i prototipi senza implementale: le funzioni astratte hanno questa dicitura: <<virtual void func() = 0>>;
    Probabilmente l'autore del tuo testo avrà confuso il C++ con il Java, perchè l'algoritmo del libro in Java può essere eseguito senza errori.

  9. #9
    Utente di HTML.it
    Registrato dal
    Mar 2006
    Messaggi
    118
    Originariamente inviato da pablo1986
    ora,sempre inerente a questo argomento sto provando a capire coma mai con questo codice:

    /*provaclass.h*/
    class vettore
    {
    public:
    float numero;
    vettore(int n);
    vettore();
    };
    class vettoreinteriublic vettore
    {
    int ciao;
    };

    /*programma*/

    #include<iostream.h>
    #include<conio.h>
    #include "provaclass.h"
    vettore::vettore(int n)
    {
    numero=(20+n);
    }
    vettore::vettore()
    {
    numero=100;
    }

    main()
    {
    vettoreinteri vett;
    cout<< "Il valore di numero vale: "<<vett.numero<<endl;
    getch();
    return(0);
    }

    compliando ed eseguendo questo codice non mi viene segnalato nessun errore e il costruttore chiamato è giustamente vettore di default.
    E fino qua tutto ok.
    Ma se invece di
    "vettoreinteri vett;" nel main metto "vettoreinteri vett(5)" mi da errore mentre io mi attendo che chiami il costruttore "vettore(int n)"
    come mai???????
    Purtroppo in c++ non è possibile ereditare un costruttore parametrico.
    Viene ereditato come costruttore di default sole le funzioni senza argomenti.L'overload dei costruttori non può essere ereditato.

    Questo per quanto riguarda l'ANSI C++.

  10. #10
    quindi i costruttori non sono ereditati???????????????????

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.