Array
(
)

chamar destrutor da classe base.

Vitor^_^
   - 06 mai 2009

PessoAll. Antes de mais nada, peço desculpas caso eu faça alguma comparação do C++ com alguma outra linguagem. É que C++ não é minha linguagem ´nativa´.


Numa classe que eu criei descendente de outra que já existia eu preciso sobrescrever um metodo. Nesse metodo eu executo algumas instuções e no final chamo o metodo da classe base, para não copiar codigo. Como eu faço para chamar o metodo da classe base?

No delphi eu faço inherited metodo
no C# eu faço base.metodo()
no java é super.metodo e no vb tambem.


e no C++?

da certo de o metodo for o destrutor da classe? pergunto isso porque no destrutor da minha classe eu tenho que liberar da memoria alguns objetos privados desta classe, mas depois preciso chamar o destrutor da classe mae, para que seja executado o memso codigo e liberadas as coisas das quais não tenho conhecimento.


se fosse delphi eu fazia:
destructor tminhaclasse.destroy
begin
objetoaki.free;
inherited;
end;


mas como eu faço isso no c++ builder? funciona em outros compiladores c++?


Rodc
   - 11 mai 2009

É mais ou menos como no C#:#Código

base::metodo();



Vitor^_^
   - 11 mai 2009

não sabia que existia a palavra chave base.

vou testar e já posto o resultado. muito obrigado!


Rodc
   - 11 mai 2009


Citação:
não sabia que existia a palavra chave base.

Opâ... não existe a palavra chave ´base´, acho que me expressei mal. ´base´ é o nome da classe ancestora. Exemplo:
#Código

class TmeuBotao : public(TButton)
{
public:
Click(); // sobrescrita de função da classe base
}

#Código
TmeuBotao::Click()
{
TButton::Click();
}



Vitor^_^
   - 11 mai 2009

beleza, agora entendi.
Só que no caso, o metodo que eu quero sobrescrever é o destructor, e a classe base é, eu acho, TObject.

eu posso chamar, dentro do meu destructor novo

Tobject::~Tobject

ou

tobject::destroy?

no c++ builder as classes são mesmo todas descendentes de Tobject como no delphi?


pergunto isso porque não quero causar memory leaks. Se a classe base criasse um TstringList privado eu gostaria que esse stringlist fosse destruido tanto no destructor da minha classe como no destructor de seus descendentes.


Vitor^_^
   - 11 mai 2009

tentei TObject::destroy mas não existe esse metodo.

com TObject::Free dá stack overflow. parece que cria uma chamada recursiva a free.


parece que eu não devo fazer isso no destructor Tminhaclasse:~Tminhaclasse

né?

tenho que criar um metodo destroy? é isso? ou free?


Rodc
   - 11 mai 2009

O create e destroy da classe em C++ é tratado de uma forma diferente.
A função __fastcall TmeuObject() e __fastcall ~TmeuObject() seriam equivalentes ao Initialization e Finalization das classes do Delphi, que normalente só são usadas nos componentes.

A função de create e destroy do C++ não é bem uma função, tanto que não tem retorno. Nelas você não precisa chamar o destroy nem o create da classe base porque a VCL já faz isto automaticamente.

Como teste, uma classe descendente da outra e teste com BreakPoints como ele executa as funções de create e destroy de todas as classes bases automaticamente.


Vitor^_^
   - 11 mai 2009

beleza então!

não preciso me preocupar com memory leaks nesse caso?

Valew! Obrigado pela ajuda.


Rodc
   - 11 mai 2009

Neste seu caso não precisa se preocupar. Se você está usando o C++ Builder, você pode ativar o CodeGuard nas opções de Debug do projeto. Este CodeGuard te avisa caso você esteja deixando memória sem ser liberada ou se está acessando uma posição de um vetor que não existe (muito comum no C++).