Classes abstratas e c ++

++ suportes C ligação tardia

, que é quando se elimina uma chamada de método com base no tipo de tempo de execução (ou tipo dinâmico) do objecto alvo, em vez do seu tipo declarado (ou tipo estático). Isto é demonstrado no seguinte fragmento de código C ++:

Video: C++ Classes - Part 1 of 2 - Definition and Instantiation

#incluir using namespace std classe Forno {public: virtual void cozinheiro () {cout lt; lt; "Cozinhar com um forno" lt; lt; endl -}} - forno de micro-ondas de classe: public Forno {public: virtual void cozinheiro () {cout lt; lt; "Cozinhar com um forno de microondas" lt; lt; endl -}} - vazio prepareMeal (Forno& forno) {oven.cook () -}

Na função prepareMeal (), a chamada para oven.cook () pode passar para Forno :: cozinhar () ou Forno de micro-ondas :: cozinhar () dependendo do tempo de execução (o “real”) tipo de forno objecto transmitido.

o virtual palavra-chave é fundamental aqui. Sem ele, o cozinhar() método seria ligada cedo, com base no tipo de tempo de compilação, e invocar Forno :: cozinhar () toda vez. Uma vez declarada virtual no Forno classe, o método é assumido como ser virtual em cada subclasse, mas não faz mal repetir a declaração para que os leitores a entender.

O seguinte programa simples demonstra esse princípio em prática:

int main () {forno-prepareMeal (forno) -MicrowaveOven mo-prepareMeal (mo) -Retornar 0-}

Neste programa, a chamada para cozinhar() gera duas saídas diferentes, dependendo do tipo de forno:

Cozinhar com um ovenCooking com um forno de microondas

Nem sempre é o caso, que um método na classe de base pode ser definido. considere o Forno caso mais cuidado. Há um número de diferentes tipos de fornos - fornos convencionais, fornos de convecção, e fornos de microondas - mas pode-se argumentar que não há forno real que não pertence a uma dessas subclasses. Você pode ser capaz de dizer como os vários tipos de fornos de realizar a cozinhar operação - isto é, o que é um ConventionalOven :: cozinhar () e uma Forno de micro-ondas :: cozinhar () deve fazer pode ser definida. Provavelmente não é possível definir quais ações Forno :: cozinhar () deve executar.

Video: Buckys C++ Programming Tutorials - 12 - Introduction to Classes and Objects

Você não pode simplesmente deixar Forno :: cozinhar () não declarado em uma linguagem fortemente digitado como C ++. No entanto, você pode declarar um método mas deixá-lo unimplemented se existe nenhuma implementação. Um usa a seguinte sintaxe curioso a fazê-lo:



classe Forno {public: virtual void cozinheiro () = 0 -} -

Esse código declara um método Forno::cozinhar() que é obrigado tarde, mas não implementar o método. Na verdade, ele vai mais longe, dizendo que o método não será implementada. Em C ++, um tal método está a ser dito virtual pura. programadores C ++ também usam o termo preferido em muitas outras linguagens de computador rigidez: abstrato. o Forno classe é dito ser abstrato.

Video: C++ Tutorial for Beginners 34 - Friend Class in C++

Um resumo representa uma propriedade que você sabe a classe possui, mas não sei como implementar de forma inequívoca na classe atual.

A classe é abstrata se ele contém um ou mais puros métodos virtuais. O significado disto é que você não pode instanciar uma classe abstrata. Assim, a seguinte não é permitido:

Video: 17. C++ Tutorial - First Class Example Point Object C++

int main () {forno-prepareMeal (forno) -Retornar 0-}

A razão para isso é bastante simples: se você criou um objeto da classe Forno e depois tentou invocar oven.cook (), o que deve o compilador fazer?

A um nível mais filosófica, é bom dizer que há algum termo comum chamada Forno que descreve fornos convencionais e fornos de microondas e fornos de convecção. Esse termo Forno é um conceito usual porque se liga-se as semelhanças entre todas estas subclasses. Mas não há nenhuma instância de um forno que não é uma das subclasses de Forno.

Uma subclasse de uma classe abstrata é a própria abstrato até que todos os métodos virtuais puros foram substituídos por não-abstrato (ou seja, concreto) versões. Assim, a classe Forno de micro-ondas no trecho de código anterior não é abstrato - mesmo se Forno foram abstrato - porque substitui cozinhar() com sua própria versão de concreto.

Observe que não há nada de errado com a função prepareMeal () definido como se segue:

anular prepareMeal (Forno& forno) {oven.cook () -}

Mesmo que o argumento é declarado para ser um Forno, ele só pode ser invocado com alguma subclasse de Forno, tal como Forno de micro-ondas ou Forno convencional, para qual cozinhar() é definido.


Publicações relacionadas