Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente di HTML.it
    Registrato dal
    Jan 2011
    Messaggi
    47

    [C++] Funzioni virtuali e loro implementazione

    Salve,
    sto avendo problemi con il seguente codice:

    main.cpp
    codice:
    #include "MyClass4.h"
    
    int main() {
        MyClass4 x;   // C2259
        system("pause");
    }
    MyClass3.h
    codice:
    class MyClass3 {
    public:
        virtual void func(WCHAR*, MyClass3 &) = 0;
    };
    MyClass4
    codice:
    #include <windows.h> 
    #include <iostream>
    using namespace std;
    
    #include "MyClass3.h"
    class MyClass4 : public MyClass3 {
    public:
        void func(WCHAR*, MyClass4 &);
    };
    
    void MyClass4::func(WCHAR *w, MyClass4 &my) {
        cout << "pppppp" << endl;
    }
    Il compilatore mi restituisce il seguente errore:
    Gravità Codice Descrizione Progetto File Riga
    Errore C2259 'MyClass4': impossibile creare un'istanza di classe astratta

  2. #2
    È corretto; la func che hai definito in MyClass4 non ha lo stesso prototipo di quella dichiarata come virtuale pura in MyClass3, per cui hai semplicemente aggiunto un overload, non hai implementato la funzione virtuale. Ne segue che MyClass4 rimane una classe astratta, che non può essere istanziata.

    Nota che in C++ è possibile implementare una funzione virtuale specificando un tipo restituito di classe più derivata, dato che C++ consente la covarianza rispetto al tipo restituito; in altre parole, è possibile fare:
    codice:
    class A {
        virtual A* func()=0;
    };
    
    class B : public A {
        virtual B* func() { return new B; }
    };
    La covarianza rispetto al tipo restituito è sempre consentita dato che la classe derivata fornisce più garanzie rispetto a quanto richiesto dal contratto dell'interfaccia; in altre parole, se chiamo func() su un'istanza di B tramite un puntatore ad A è corretto che mi vengano restituiti dei B*, visto che B deriva da A. Viceversa, il tuo caso non è consentito, dato che si potrebbe chiamare la func di un'istanza di MyClass4 tramite un MyClass3, per cui MyClass4::func potrebbe ricevere come secondo argomento un puntatore a MyClass3 quando il suo prototipo richiede una MyClass4 (più specifica).
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Utente di HTML.it
    Registrato dal
    Jan 2011
    Messaggi
    47
    Ok, grazie. Il problema era proprio quello.
    Come faccio a segnalare che il problema è risolto?

  4. #4
    Non si usa fare nulla di particolare in proposito su questo forum, va bene così.
    Amaro C++, il gusto pieno dell'undefined behavior.

Tag per questa discussione

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 © 2025 vBulletin Solutions, Inc. All rights reserved.