объявления абстрактного класса в c ++ - PullRequest
7 голосов
/ 18 апреля 2011

Предположим, foo является абстрактным class в программе на C ++, почему допустимо объявлять переменные типа foo*, но не типа foo?

Ответы [ 5 ]

14 голосов
/ 18 апреля 2011

Потому что, если вы объявляете foo, вы должны инициализировать / создать его экземпляр. Если вы объявляете * foo, вы можете использовать его для указания на экземпляры классов, которые наследуются от foo, но не являются абстрактными (и, следовательно, могут быть созданы)

5 голосов
/ 18 апреля 2011

Вы не можете создать экземпляр абстрактного класса. И есть различия между следующими декларациями.

// declares only a pointer, but do not instantiate.
// So this is valid
AbstractClass *foo;

// This actually instantiate the object, so not valid
AbstractClass foo;

// This is also not valid as you are trying to new
AbstractClass *foo = new AbstractClass();

// This is valid as derived concrete class is instantiated
AbstractClass *foo = new DerivedConcreteClass();
1 голос
/ 18 апреля 2011

Также, поскольку абстрактные классы обычно используются в качестве родителей (базовые классы - азбука), которые вы используете для полиморфизма

class Abstract {}

class DerivedNonAbstract: public Abstract {}


void CallMe(Abstract* ab) {}


CallMe(new DerivedNonAbstract("WOW!"));
0 голосов
/ 18 апреля 2011

Потому что, если мы объявляем foo, что означает, что мы создаем экземпляр класса foo, который является абстрактным, и невозможно создать экземпляр абстрактного класса.Однако мы можем использовать указатель абстрактного класса, чтобы указать на его классы дисков, чтобы воспользоваться преимуществами полиморфизма.,.

0 голосов
/ 18 апреля 2011

Потому что указатель на foo не является foo - они совершенно разных типов.Создание абстрактного класса говорит о том, что вы не можете создавать объекты типа класса, а также что вы не можете создавать указатели (или ссылки) на класс.

...