chamar destrutor da classe base.

06/05/2009

1

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++?


Responder

Posts

11/05/2009

Rodc

É mais ou menos como no C#:
base::metodo();



Responder

11/05/2009

Vitor Rubio

não sabia que existia a palavra chave base.

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


Responder

11/05/2009

Rodc

[quote:77dc681a9e=´vitor^_^´]não sabia que existia a palavra chave base.[/quote:77dc681a9e]
Opâ... não existe a palavra chave ´base´, acho que me expressei mal. ´base´ é o nome da classe ancestora. Exemplo:
class TmeuBotao : public(TButton)
{
public:
    Click();  // sobrescrita de função da classe base
}

TmeuBotao::Click()
{
    TButton::Click();
}



Responder

11/05/2009

Vitor Rubio

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.


Responder

11/05/2009

Vitor Rubio

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?


Responder

11/05/2009

Rodc

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.


Responder

11/05/2009

Vitor Rubio

beleza então!

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

Valew! Obrigado pela ajuda.


Responder

11/05/2009

Rodc

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++).


Responder
×
+1 DevUP
Acesso diário, +1 DevUP
Parabéns, você está investindo na sua carreira