Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Principi
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.
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.
5
OOP – Parte I
Principi
Binding dinamico
Un oggetto potrebbe eseguire un'azione diversa a seconda
della sottoclasse a cui appartiene:
6
OOP – Parte I
Principi
Binding dinamico
Animal *my_pet
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.
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();
12
OOP – Parte I
Principi
Sottotipaggio
B è sottotipo di A se, ovunque sia richiesto un tipo A, è possibile
usare un tipo B:
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