Frage zu Ableitung



  • Hallo,
    ich habe eine Frage zu einem kleinen Konstrukt, das nicht so funktioniert wie ichs mir vorgestellt habe.

    • Die Klasse "BaseExport" wird über eine statische Methode angesprochen, die ein konkretes Objekt zurückliefert, das die Export-Schnittstelle implementiert.
    • Die beiden Klassen "Export01" und "Export02" implementieren jeweils eine eigene Version der Export-Schnittstelle.

    Wenn ich den nachfolgenden (vereinfachten) Quellcode mit VS2010 kompiliere, bekomme ich die Fehlermeldung:
    1>error C2248: 'Export02::Export02' : cannot access protected member declared in class 'Export02'

    Ein Objekt vom Typ "Export01" kann ausgeprägt werden da der Konstruktor ja public ist.
    Ein Objekt vom Typ "Export02" anscheinend nicht, obwohl es protected ist. Sollte doch aber eigentlich gehen, oder nicht?

    Danke und Gruß
    Matze

    class BaseExport;
    class Export01;
    class Export02;
    
    class BaseExport
    {
    public:
    	static BaseExport* getExportObject(int iNr);
    	virtual void doExport() = 0;
    };
    
    class Export01 : public BaseExport
    {
    public:
    	Export01();
    	void doExport();
    };
    
    Export01::Export01()
    {
    	cout << "ctor Export01" << endl;
    }
    
    void Export01::doExport()
    {
    	cout << "export Export01" << endl;
    }
    
    class Export02 : public BaseExport
    {
    protected:
    	Export02();
    
    public:
    	void doExport();
    };
    
    Export02::Export02()
    {
    	cout << "ctor Export02" << endl;
    }
    
    void Export02::doExport()
    {
    	cout << "export Export02" << endl;
    }
    
    BaseExport* BaseExport::getExportObject(int iNr)
    {
    	if (iNr == 1) return new Export01();
    	else if (iNr == 2) return new Export02();
    }
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    	BaseExport *exp = BaseExport::getExportObject(1);
    	exp->doExport();
    }
    


  • MatzeGTO schrieb:

    Ein Objekt vom Typ "Export02" anscheinend nicht, obwohl es protected ist. Sollte doch aber eigentlich gehen, oder nicht?

    Wenn du von Export02 ableitest, dann kannst du auf die Member zugreifen. Aber hier ist Export02 von BasicExport abgeleitet.



  • Hallo,

    Ein Objekt vom Typ "Export02" anscheinend nicht, obwohl es protected ist. Sollte doch aber eigentlich gehen, oder nicht?

    Nicht "obwohl", sondern "weil".

    Da der Konstruktor protected ist, darf die Klasse von außerhalb nicht instanziiert werden.

    BaseExport::getExportObject ist außerhalb.

    mfg Martin


Anmelden zum Antworten