How can i call functions of an abstract base class in C++?
I am using VSS API and using this abstract base class CVSSWriter.I want to call its functions but I can't make its object. How should I inherit it because its a class defined in VSWriter.h Here is the link for information about its methods http://msdn.microsoft.com/en-us/library/aa381524%28v=VS.85%29.aspx
Please help as I am stuck.
I tried this but it does not work.
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;
}
};
These four are the pure virtual functions and there are some virtual functions as well.
The implementation for that class is
'
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;
};
'
An abstract class is not instantiable, and in most cases they are used to define interfaces that are later implemented in other classes. When you say that you want to call functions of the abstract class you are probably wanting to call those functions on a concrete type that inherits from that abstract class.
As an example, consider that you had a GeometricFigure
abstract class that provided an area
virtual function. You do not want to obtain the area
of an abstract figure, but rather the area
of a concrete figure (say a Triangle
). The abstract class provides you with a way of referring to different figures in an uniform way and calling the methods on those objects, but you are not calling the methods on an abstract figure, you are calling the methods in a concrete object.
精彩评论