Как я могу вызвать функции абстрактного базового класса в C ++? - PullRequest
0 голосов
/ 08 июля 2011

Я использую VSS API и использую этот абстрактный базовый класс CVSSWriter. Я хочу вызывать его функции, но не могу создать его объект.Как я должен наследовать его, потому что это класс, определенный в VSWriter.h Вот ссылка на информацию о его методах http://msdn.microsoft.com/en-us/library/aa381524%28v=VS.85%29.aspx

Пожалуйста, помогите, когда я застрял.

Я пробовал это, но этоне работает.

class SPCVssWriterEx:public CVssWriter
{
private:
   LONG _cRef;


public:
      SPCVssWriterEx(){}

     ~SPCVssWriterEx(){}

 // callback for prepare snapsot event
 bool STDMETHODCALLTYPE OnPrepareSnapshot()
     {
      return true;
     }


 // callback for freeze event
 bool STDMETHODCALLTYPE OnFreeze()
     {
       return true;
     }


 // callback for thaw event
 bool STDMETHODCALLTYPE OnThaw()
     {
       return true;
     }

// callback if current sequence is aborted
 bool STDMETHODCALLTYPE OnAbort()
    {
      return true;
    }

};

Эти четыре являются чисто виртуальными функциями, а также есть некоторые виртуальные функции.

Реализация для этого класса

'

    class CVssWriter
   {
     // Constants
     public:

   // Constructors & Destructors
    public:
__declspec(dllexport)
STDMETHODCALLTYPE CVssWriter();

__declspec(dllexport)
virtual STDMETHODCALLTYPE ~CVssWriter();

    // Exposed operations
    public:
// initialize the writer object
__declspec(dllexport)
HRESULT STDMETHODCALLTYPE Initialize
    (
    IN VSS_ID WriterID,
    IN LPCWSTR wszWriterName,
    IN VSS_USAGE_TYPE ut,
    IN VSS_SOURCE_TYPE st,
    IN VSS_APPLICATION_LEVEL nLevel = VSS_APP_FRONT_END,
    IN DWORD dwTimeoutFreeze = 60000,           // Maximum milliseconds between Freeze/Thaw
    IN VSS_ALTERNATE_WRITER_STATE aws = VSS_AWS_NO_ALTERNATE_WRITER,
    IN bool bIOThrottlingOnly = false,
    IN LPCWSTR wszWriterInstanceName = NULL
    );

// cause the writer to subscribe to events.
__declspec(dllexport)
HRESULT STDMETHODCALLTYPE Subscribe
    (
    IN DWORD dwEventFlags = VSS_SM_BACKUP_EVENTS_FLAG | VSS_SM_RESTORE_EVENTS_FLAG
    );

// cause the writer to unsubscribe from events
__declspec(dllexport)
HRESULT STDMETHODCALLTYPE Unsubscribe();

    // installs an alternative writer
   __declspec(dllexport)
    HRESULT STDMETHODCALLTYPE InstallAlternateWriter
    (
    IN VSS_ID writerId,
    IN CLSID persistentWriterClassId
    );

// Internal properties - accessible from OnXXX methods
    protected:

// get array of volume names
__declspec(dllexport)
LPCWSTR* STDMETHODCALLTYPE GetCurrentVolumeArray() const;

// get count of volume names in array
__declspec(dllexport)
UINT STDMETHODCALLTYPE GetCurrentVolumeCount() const;

// get the name of the snapshot device corresponding to a given volume.
__declspec(dllexport)
HRESULT STDMETHODCALLTYPE GetSnapshotDeviceName
  (
  IN LPCWSTR wszOriginalVolume,
  OUT LPCWSTR* ppwszSnapshotDevice
  ) const;

// current snapshot set GUID
__declspec(dllexport)
VSS_ID STDMETHODCALLTYPE GetCurrentSnapshotSetId() const;

// Current backup context.  
__declspec(dllexport)
LONG STDMETHODCALLTYPE GetContext() const;

// current app level (either 1,2,3)
__declspec(dllexport)
VSS_APPLICATION_LEVEL STDMETHODCALLTYPE GetCurrentLevel() const;

// determine if path is in set of volumes being snapshotted
__declspec(dllexport)
bool STDMETHODCALLTYPE IsPathAffected
    (
    IN LPCWSTR wszPath
    ) const;

// does the backup include bootable state (formerly system state backup)
__declspec(dllexport)
bool STDMETHODCALLTYPE IsBootableSystemStateBackedUp() const;

// is the backup application smart (i.e., selecting components) or
// dump (i.e., just selecting volumes)
__declspec(dllexport)
bool STDMETHODCALLTYPE AreComponentsSelected() const;

__declspec(dllexport)
VSS_BACKUP_TYPE STDMETHODCALLTYPE GetBackupType() const;

__declspec(dllexport)
VSS_RESTORE_TYPE STDMETHODCALLTYPE GetRestoreType() const;

__declspec(dllexport)
bool STDMETHODCALLTYPE IsPartialFileSupportEnabled() const;

_declspec(dllexport)
    HRESULT STDMETHODCALLTYPE SetWriterFailure(HRESULT hr);

    // Ovverides
    public:
// callback when request for metadata comes in
__declspec(dllexport)
virtual bool STDMETHODCALLTYPE OnIdentify(IN IVssCreateWriterMetadata *pMetadata);

// callback for prepare backup event
__declspec(dllexport)
virtual bool STDMETHODCALLTYPE OnPrepareBackup(
    IN IVssWriterComponents *pComponent
    );

// callback for prepare snapsot event
virtual bool STDMETHODCALLTYPE OnPrepareSnapshot() = 0;

// callback for freeze event
virtual bool STDMETHODCALLTYPE OnFreeze() = 0;

// callback for thaw event
virtual bool STDMETHODCALLTYPE OnThaw() = 0;

// callback if current sequence is aborted
virtual bool STDMETHODCALLTYPE OnAbort() = 0;

// callback on backup complete event
__declspec(dllexport)
virtual bool STDMETHODCALLTYPE OnBackupComplete
    (
    IN IVssWriterComponents *pComponent
    );

// callback indicating that the backup process has either completed or has shut down
__declspec(dllexport)
virtual bool STDMETHODCALLTYPE OnBackupShutdown
    (
    IN VSS_ID SnapshotSetId
    );

// callback on pre-restore event
__declspec(dllexport)
virtual bool STDMETHODCALLTYPE OnPreRestore
    (
    IN IVssWriterComponents *pComponent
    );

// callback on post-restore event
__declspec(dllexport)
virtual bool STDMETHODCALLTYPE OnPostRestore
    (
    IN IVssWriterComponents *pComponent
    );

// callback on post snapshot event
__declspec(dllexport)
virtual bool STDMETHODCALLTYPE OnPostSnapshot
    (
    IN IVssWriterComponents *pComponent
    );

// callback on back off I/O volume event
__declspec(dllexport)
virtual bool STDMETHODCALLTYPE OnBackOffIOOnVolume
    (
    IN VSS_PWSZ wszVolumeName,
    IN VSS_ID snapshotId,
    IN VSS_ID providerId
    );

// callback on Continue I/O on volume event
__declspec(dllexport)
virtual bool STDMETHODCALLTYPE OnContinueIOOnVolume
    (
    IN VSS_PWSZ wszVolumeName,
    IN VSS_ID snapshotId,
    IN VSS_ID providerId
    );

// callback to specify that the volume snaphost service is shutting down.  Used
// by alternative writers to signal when to shutdown.
__declspec(dllexport)
virtual bool STDMETHODCALLTYPE OnVSSShutdown();

// callback to an alternative writer when the application writer subscribes.  Used to
// signal the alternative writer to shutdown.
__declspec(dllexport)
virtual bool STDMETHODCALLTYPE OnVSSApplicationStartup();

private:

IVssWriterImpl *m_pWrapper;
};

'

1 Ответ

2 голосов
/ 08 июля 2011

Абстрактный класс не является экземпляром, и в большинстве случаев он используется для определения интерфейсов, которые впоследствии будут реализованы в других классах.Когда вы говорите, что хотите вызывать функции абстрактного класса, вы, вероятно, хотите вызывать эти функции для конкретного типа, который наследуется от этого абстрактного класса.

В качестве примера рассмотрим, что у вас есть абстрактный класс GeometricFigure, предоставляющий виртуальную функцию area.Вы не хотите получить area абстрактной фигуры , а скорее area конкретной фигуры (например, Triangle).Абстрактный класс предоставляет вам способ обращения к различным фигурам единообразным способом и вызова методов этих объектов, но вы не вызываете методы на абстрактной фигуре, вы вызываете методы вбетонный объект.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...