Sei sulla pagina 1di 14

OOP – Parte I

Principi

Principi della OOP


Ereditarietà , incapsulamento, binding dinamico e sottotipaggio

1
OOP – Parte I
Principi

Ereditarietà
Le classi possono essere estese da sottoclassi:
class Bird: public Animal {
public:
void fly();
}
“Bird is a Animal”, Bird eredita i campi (attributi e metodi) di
Animal, automaticamente.

2
OOP – Parte I
Principi

Ereditarietà
Bird può accedere direttamente ai campi pubblici e protetti di
Animal, ma non a quelli privati.

In C++ esiste l'ereditarietà multipla: una classe eredita


contemporamente da più classi:
class SomeClass: public ParentA, ParentB… {

}

3
OOP – Parte I
Principi

Ereditarietà: UML
Animal

+speak()

Dog Cat

4
OOP – Parte I
Principi

Incapsulamento
Una classe espone la propria interfaccia (campi pubblici), ma
nasconde i dettagli implementativi.

Ad esempio: quando usiamo std::cout non ci preoccupiamo di


come i caratteri vengano disegnati sullo schermo
Quando usiamo my_vector.size() non ci interessia sapere come
viene memorizzata l'informazione sulla dimensione.

5
OOP – Parte I
Principi

Binding dinamico
Un oggetto potrebbe eseguire un'azione diversa a seconda
della sottoclasse a cui appartiene:

Animal *my_pet = new …;


my_pet.speak();

“speak” produce un suono diverso se my_pet è un cane od un


gatto.

6
OOP – Parte I
Principi

Binding dinamico
Animal *my_pet

my_pet = new Dog();


my_pet.speak(); // “Woof!”

my_pet = new Cat();


my_pet.speak(); // “Meow!”

7
OOP – Parte I
Principi

Binding dinamico
class Animal {
public:
virtual void speak();
};

void Animal::speak() {
std::cout << “I'm an animal.” << std::endl;
}

8
OOP – Parte I
Principi

Binding dinamico
class Dog: public Animal {
};

void Dog::speak() {
std::cout << “Woof!” << std::endl;
}

9
OOP – Parte I
Principi

Binding dinamico
class Cat: public Animal {
};

void Cat::speak() {
std::cout << “Meow!” << std::endl;
}

10
OOP – Parte I
Principi

Binding dinamico
Il binding dinamico si realizza con i metodi virtuali, ovvero
metodi che possono essere ridefiniti nelle sottoclassi.

Esistono poi i metodi virtuali puri, che devono essere ridefiniti


nelle sottoclassi:
class Animal {
virtual void foo() = 0;
};

11
OOP – Parte I
Principi

Sottotipaggio
In C++, l'ereditarietà comporta anche sottotipaggio: se B è
sottoclasse di A, un'istanza di una classe B è anche istanza di
una classe A.

Dog my_pet();

my_pet è un Dog, ed è anche un Animal.

12
OOP – Parte I
Principi

Sottotipaggio
B è sottotipo di A se, ovunque sia richiesto un tipo A, è possibile
usare un tipo B:

void foo(Animal my_animal) {



}

Dog my_dog();
foo(my_dog);

13
OOP – Parte I
Principi

Metodi statici
Normalmente i metodi appartengono ad un'oggetto, una particolare
istanza della classe. Alcuni metodi esistono a prescindere dall'oggetto e
sono legati solo alla classe:

class Math {
static double sin(double angle);
static double cos(double angle);
};

std::cout << Math::sin(0.15) << std::endl;

14

Potrebbero piacerti anche