Ошибка: не удается создать экземпляр абстрактного класса

Osibka Ne Udaetsa Sozdat Ekzemplar Abstraktnogo Klassa



Эта статья о другой ошибке, которая часто возникает, когда мы работаем с абстрактными классами в нашем коде. Давайте изучим концепцию абстрактных классов в объектно-ориентированном программировании. Класс, который не может иметь никаких объектов, созданных из самого себя, известен как абстрактный класс. Его также называют интерфейсом на языке C++. Любой класс можно сделать абстрактным в языке C++, объявив в нем чисто виртуальную функцию. Чтобы объявить виртуальную функцию, мы должны поставить «=0» после функции. Абстрактный класс действует как родительский или базовый класс, от которого происходят все остальные дочерние классы. Итак, чтобы получить доступ к абстрактному классу, мы должны наследовать его от его базовых классов. Когда мы пытаемся создать экземпляр абстрактного класса, мы получаем ошибку компиляции.

Синтаксис

Сообщение об ошибке нашей ошибки выглядит следующим образом:

ошибка : нельзя объявить переменную ‘’ абстрактного типа ‘’

Обратите внимание, что в пустых скобках будут имена переменных и абстрактных классов.







ошибка C2259 : 'Состояние' : не может создать экземпляр абстрактного класса

Это еще одно сообщение, которое мы получаем от компилятора, когда сталкиваемся с такой ошибкой.



Пример #01:

Чтобы сделать эту ошибку понятной, мы выполним пример, в котором мы напишем наш код таким образом, что получим ошибку. Для этой цели мы инициализировали класс с именем «ShapeClass». Чтобы сделать этот класс абстрактным, мы объявили в нем виртуальную функцию с именем «getArea». Мы также объявили две другие функции с именами «setWidth» и «setHeight» соответственно. Здесь мы хотим получить высоту в качестве параметра и ширину в качестве входного параметра. Мы будем вычислять площадь с помощью наших входных параметров. Мы создали экземпляр нашего класса в основном методе. С помощью этого объекта мы вызвали методы и будем передавать входные параметры через эти методы. После этого мы распечатали наш вывод, чтобы проверить результаты.



#include <иопоток>

используя пространство имен std ;
класс ShapeClass
{
публичный :
виртуальный инт Гетария ( ) знак равно 0 ;
пустота setWidth ( инт в )
{
ширина знак равно в ;
}
пустота setHeight ( инт час )
{
высота знак равно час ;
}
защищенный :
инт ширина ;
инт высота ;
} ;
инт главный ( пустота )
{
ШейпКлассш ;
ш. setWidth ( 1 ) ;
ш. setHeight ( два ) ;
cout << 'Общая площадь прямоугольника:' << ш. Гетария ( ) << конец ;
возвращаться 0 ;
}

Система выдала нам ошибку после выполнения нашего кода. В сообщении об ошибке говорится, что мы не можем объявить переменную «sh» абстрактного типа «shapeclass». Теперь компилятор пытается передать, что «ShapeClass» — это абстрактный тип, и мы не можем объявить его переменную. Итак, с сообщением мы можем ясно понять, что компилятор не позволяет нам создавать экземпляр нашего абстрактного класса, поэтому система выдает нам ошибку.





Чтобы устранить ошибку, мы объявили еще один класс «Прямоугольник». Этот класс будет дочерним классом нашего абстрактного класса, и мы будем объявлять тело нашей виртуальной функции в этом классе. После этого мы создадим его объект в основном методе и с помощью его объекта будем вызывать функции.



После внесения поправок мы создали наш код, и теперь нам удалось запустить наш код. Система выполнила наш код без ошибок. В выводе мы видим, что система вычислила площадь прямоугольника и напечатала вывод. Мы узнали, что наша ошибка заключалась в том, что мы напрямую вызывали объект нашего абстрактного класса, что было неправильным подходом. Когда мы вызвали объект его дочернего класса, наш код заработал нормально.

Пример #02:

В этом примере мы не будем делать никаких математических вычислений. Этот пример является общим примером, который поможет нам понять абстрактные классы и то, как компилятор работает между методами и классами при выполнении кода. В этом классе мы создали абстрактный класс и назвали его «AbsClass». Мы объявили еще один класс «ChildClass», но это не абстрактный класс. Этот класс является производным от нашего абстрактного класса.

Мы напечатали «Значение, переданное с использованием объекта» в методе, объявленном в абстрактном классе. Имя функции — «valueFunc». Как мы уже говорили, тело виртуальной функции объявляется в дочернем классе. В нашем дочернем классе мы напечатали «В виртуальной функции» в теле виртуальной функции. Теперь мы передадим значение нашей функции значений и посмотрим, правильно ли полученное значение. В нашем основном методе мы создали экземпляр нашего абстрактного класса и с помощью этого экземпляра будем вызывать наши виртуальные и другие функции. Теперь мы выполним наш код.

#include <иопоток>

используя пространство имен std ;
класс АбсКласс
{
публичный :
виртуальный инт VirtFunc ( ) знак равно 0 ;
пустота valueFunc ( инт в )
{
ширина знак равно в ;
cout << 'Значение передано с использованием объекта' << в << конец ;
}
защищенный :
инт ширина ;
} ;
класс дочерний класс :
публичный AbsClass
{
публичный :
инт VirtFunc ( ) {
cout << «В виртуальной функции» << конец ;
}
} ;
инт главный ( пустота )
{
Копия дочернего класса ;
куб.см. valueFunc ( 5 ) ;
cout << куб.см. VirtFunc ( ) << конец ;
возвращаться 0 ;
}

После выполнения нашего кода мы получим ошибку. Эта ошибка в основном заключается в том, что мы не можем создать экземпляр абстрактного класса, который мы пытаемся сделать здесь, в нашем основном методе. Здесь следует отметить, что переменная и абстрактный тип в нашем сообщении были изменены.

Теперь мы попытаемся удалить нашу ошибку и выполнить наш код. Для этого мы создадим объект нашего дочернего класса и создадим его экземпляр. С помощью этого экземпляра мы будем вызывать как виртуальный, так и другой метод в нашем абстрактном классе. Также будет наблюдаться, можем ли мы получить доступ к виртуальной функции с помощью дочернего класса или нет. Если нам это удастся, мы можем сказать, что получили доступ к абстрактному классу, используя его производный класс.

На этот раз при выполнении нашего кода компилятор не выдал ни одной ошибки. Вместо этого система успешно скомпилировала наш код и выдала нам результат. Теперь давайте посмотрим на вывод. Система напечатала «Значение передано с использованием объекта» и «5» напротив него. Потому что мы передали 5, используя наш экземпляр в основном методе. После этого он напечатал строку, которую мы запросили в нашей виртуальной функции.

Вывод

В этом руководстве мы обсудили критические ошибки, с которыми сталкиваются программисты при кодировании и применении объектно-ориентированных концепций. Эти типы ошибок часто возникают, когда программист имеет дело с абстрактными классами. Вся статья резюмирует, что абстрактные классы не могут быть созданы, и мы не можем заставить их объекты вызывать в нем методы. Мы также попробовали разные примеры для создания ошибок, а затем исправили ошибки в нашем коде.