Шаг 17 - Абстрактные классы

Объекты COM, OLE, ActiveX отличаются от обычных классов наличием интерфейсов. При работе с COM или OLE важно понятие абстрактного класса. Давайте решим так. Абстрактный класс это класс, который имеет объявление, но не имеет реализации. То есть для использования данного класса придется вывести из него другой класс, в котором и будут реализованы возможности. Смотрите пример абстракного класса.

// TTT.cpp : Defines the entry point for the application.
//

#include "stdafx.h"

class COleTestAbstract
{
public:
	virtual void Msg()=0;
};

int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
 	// TODO: Place code here.
	// Закоментированно так как ошибочно
	   	//COleTestAbstract cb; 

	return 0;
}

Как видите объявлен класс без реализации. Просто он есть. Если раскомментировать строку с объявлением, то Вы получите ошибку типа как ниже.

D:\PROJECT\TTT\TTT.cpp(29) : error C2259: 'COleTestAbstract' : cannot instantiate abstract class due to following members:
D:\PROJECT\TTT\TTT.cpp(7) : see declaration of 'COleTestAbstract'

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

// TTT.cpp : Defines the entry point for the application.
//

#include "stdafx.h"

class COleTestAbstract
{
public:
	virtual void Msg()=0;
};

class COAbsatract : public COleTestAbstract
{
public:
	 void Msg();
};

void COAbsatract::Msg()
{
}

int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
 	// TODO: Place code here.
	//
       //COleTestAbstract cb; 
	COAbsatract co;
	return 0;
}

Данный пример компилируется без проблем. Так и в модели COM, есть ряд абстрактных классов, которые необходимо реализовывать в Вашем объекте, например, IUnknown,IClassFactory,IDispath и так далее.


Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Каев Артем.