Erro: Não é possível instanciar a classe abstrata

Erro Nao E Possivel Instanciar A Classe Abstrata



Este artigo é sobre outro erro que ocorre frequentemente quando estamos trabalhando com classes abstratas em nosso código. Vamos estudar o conceito de classes abstratas em Programação Orientada a Objetos. Uma classe que não pode ter nenhum objeto criado a partir dela mesma é conhecida como classe abstrata. Também é chamado de interface na linguagem C++. Qualquer classe pode se tornar abstrata na linguagem C++ declarando uma função virtual pura nela. Para declarar uma função virtual, devemos colocar “=0” após a função. A classe abstrata atua como uma classe pai ou base da qual todas as outras classes filhas são derivadas. Então, para acessar a classe abstrata, temos que herdá-la de suas classes base. Quando tentamos instanciar uma classe abstrata, obtemos um erro de compilação.

Sintaxe

A mensagem de erro do nosso erro é a seguinte:

erro : não pode declarar a variável ‘ ’ como sendo do tipo abstrato ‘’

Observe que entre parênteses vazios, haverá nomes de variáveis ​​e classes abstratas.







erro C2259 : 'Estado' : não pode instanciar classe abstrata

Esta é outra mensagem que recebemos do compilador quando encontramos esse erro.



Exemplo nº 01:

Para tornar esse erro compreensível, faremos um exemplo em que escreveremos nosso código de forma que obtenhamos um erro. Para isso, inicializamos uma classe com o nome “ShapeClass”. Para tornar esta classe abstrata, declaramos uma função virtual nela com o nome “getArea”. Também declaramos duas outras funções com os nomes “setWidth” e “setHeight” respectivamente. O que queremos fazer aqui é obter Altura como parâmetro e largura como parâmetro de entrada. Estaremos calculando a área com a ajuda de nossos parâmetros de entrada. Criamos uma instância da nossa classe no método main. Com a ajuda desse objeto, chamamos os métodos e passaremos os parâmetros de entrada por esses métodos. Depois disso, imprimimos nossa saída para verificar os resultados.



#include

usando namespace std ;
classe ShapeClass
{
público :
virtual int Getaria ( ) = 0 ;
vazio definirLargura ( int dentro )
{
largura = dentro ;
}
vazio definir altura ( int h )
{
altura = h ;
}
protegido :
int largura ;
int altura ;
} ;
int a Principal ( vazio )
{
ShapeClasssh ;
sh. definirLargura ( 1 ) ;
sh. definir altura ( dois ) ;
cout << 'Área total do retângulo: ' << sh. Getaria ( ) << fim ;
Retorna 0 ;
}

O sistema nos deu um erro após a execução do nosso código. A mensagem de erro diz que não podemos declarar a variável 'sh' como sendo do tipo abstrato 'shapeclass'. Agora, o compilador está tentando transmitir que ‘ShapeClass’ é um tipo abstrato e não podemos declarar sua variável. Assim, com a mensagem, podemos entender claramente que o compilador não está nos deixando instanciar nossa classe abstrata por isso o sistema está nos dando o erro.





Para resolver o erro, declaramos outra classe ‘Rectangle’. Esta classe será a classe filha de nossa classe abstrata e estaremos declarando o corpo de nossa função virtual nesta classe. Após isso, criaremos seu objeto no método main e com o auxílio de seu objeto, chamaremos as funções.



Após as alterações, fizemos nosso código e agora conseguimos executar nosso código com sucesso. O sistema executou nosso código sem dar erros. Podemos ver na saída que o sistema calculou a área de um retângulo e imprimiu a saída. Aprendemos que nosso erro foi chamar diretamente o objeto de nossa classe abstrata, o que era a abordagem errada. Quando chamamos o objeto de sua classe filha, nosso código começou a funcionar bem.

Exemplo nº 02:

Neste exemplo, não faremos nenhum cálculo matemático. Este exemplo é um exemplo genérico que nos ajudará a entender as classes abstratas e como o compilador roda entre os métodos e classes enquanto executa o código. Nesta classe, criamos uma classe abstrata e a nomeamos “AbsClass”. Declaramos outra classe “ChildClass”, mas esta não é uma classe abstrata. Esta classe é derivada de nossa classe abstrata.

Imprimimos “Valor passado usando Objeto” em um método declarado na classe abstrata. O nome da função é “valueFunc”. Conforme discutimos, o corpo da função virtual é declarado na classe filha. Em nossa classe filha, imprimimos “In virtual function” em nosso corpo de função virtual. Agora, vamos passar um valor para nossa função de valor e ver se o valor alcançado está correto. Em nosso método main, criamos uma instância de nossa classe abstrata e com a ajuda da instância, chamaremos nossas funções virtuais e outras. Agora, vamos executar nosso código.

#include

usando namespace std ;
classe AbsClass
{
público :
virtual int VirtFuncGenericName ( ) = 0 ;
vazio valueFunc ( int dentro )
{
largura = dentro ;
cout << 'Valor passado usando Object' << dentro << fim ;
}
protegido :
int largura ;
} ;
classe ChildClass :
public AbsClass
{
público :
int VirtFuncGenericName ( ) {
cout << 'Na função virtual' << fim ;
}
} ;
int a Principal ( vazio )
{
ChildClass cc ;
cc. valueFunc ( 5 ) ;
cout << cc. VirtFuncGenericName ( ) << fim ;
Retorna 0 ;
}

Após a execução do nosso código, obteremos um erro. Este erro é basicamente que não podemos instanciar uma classe abstrata que estamos tentando fazer aqui em nosso método principal. Uma coisa a observar aqui é que a variável e o tipo abstrato em nossa mensagem foram alterados.

Agora, tentaremos remover nosso erro e executar nosso código. Para isso, criaremos o objeto de nossa classe filha e faremos sua instância. Com a ajuda dessa instância, chamaremos o virtual e outro método em nossa classe abstrata. Também será observado se podemos acessar a função virtual usando a classe filha ou não. Se formos bem-sucedidos, podemos dizer que acessamos a classe abstrata usando sua classe derivada.

Após a execução do nosso código, o compilador não apresentou nenhum erro desta vez. Em vez disso, o sistema compilou nosso código com sucesso e nos forneceu a saída. Agora, vamos dar uma olhada na saída. O sistema imprimiu “Valor passado usando Objeto” e “5” contra ele. Porque passamos 5 usando nossa instância no método main. Depois disso, imprimiu a linha que pedimos em nossa função virtual.

Conclusão

Neste guia, discutimos erros críticos que os programadores encontram ao codificar e praticar conceitos orientados a objetos. Esses tipos de erros geralmente ocorrem quando um programador está lidando com classes abstratas. Todo o artigo resume que classes abstratas não podem ser instanciadas e não podemos fazer com que seus objetos chamem métodos nela. Também tentamos diferentes exemplos para criar erros e, em seguida, resolvemos os erros em nosso código.