Dans ce cas particulier, CMediaType
étend AM_MEDIA_TYPE
directement, de sorte que le casting fonctionnera très bien. (Vous parlez des classes DirectShow, êtes-vous?) Vous pouvez toujours lancer des sous-classes à leurs classes de base en toute sécurité, c'est pourquoi ça va marcher.
Voici une simple structure de classe avec l'héritage:
public class Animal {
public abstract String makeSound();
public void move(...) {
...
}
}
public class Lion extends Animal {
public String makeSound() {
return "GRRRRRR";
}
public void yawn() {
...
}
}
Vous pouvez instancier un lion comme celui-ci, puis le jeter à une sécurité animale:
Lion lion = new Lion();
Animal animal = (Animal) lion; //Perfectly legal
animal.move();
animal.makeSound();
En étendant Animal
(ou héritant de Animal
, comme on l'appelle aussi), la classe Lion
déclare que c'est aussi un animal (ils ont une relation is-a), donc, il est sûr de lancer un lion à un animal et de supposer qu'il a toutes les propriétés et méthodes définies dans la classe Animal
.
casting une classe de base à une sous-classe, cependant, ne fonctionnera pas habituellement:
Animal animal = getAnimalFromSomeWhere();
Lion lion = (Lion) animal;
lion.yawn();
Cela ne peut pas fonctionner, car pas tous les animaux est un lion. En fonction de la langue, vous obtiendrez des erreurs de type cast ou juste un comportement indéfini lors de l'exécution.
Il existe une exception: Si vous savez avec certitude que l'objet dont vous disposez appartient à une sous-classe particulière, vous pouvez quand même effectuer le cast. Donc, si l'animal est en fait un Lion
, ça va très bien fonctionner:
Animal animal = getAnimalFromSomeWhere();
Lion lion = (Lion) animal; //works if animal is lion, fails otherwise
lion.yawn();
La plupart des langues offrent des contrôles de type à l'exécution (« ? Est-ce cet animal un lion »), je ne sais pas comment cela pourrait regarder en C++, bien que, si un autre exemple Java-ish:
if (animal instanceof Lion) {
Lion lion = (Lion) animal; //safe
}
Bonjour, parlez-vous spécifiquement de C ou C++? Vous mentionnez C dans votre question mais étiqueté avec C++. – Earlz
Les deux, en fait. – icurl