Struct l'Héritage en C
Puis-je hériter d'une structure en C? Si oui, comment?
- Il n'y a pas une telle chose comme l'héritage en C
- ...À moins de le mettre en œuvre.
Vous devez vous connecter pour publier un commentaire.
Puis-je hériter d'une structure en C? Si oui, comment?
Vous devez vous connecter pour publier un commentaire.
Le plus proche que vous pouvez obtenir est assez commun idiome:
Comme
Derived
commence avec une copie deBase
, vous pouvez le faire:Où
d
est une instance deDerived
. Donc, ils sont en quelque sorte des polymorphes. Mais avoir des méthodes virtuelles est un autre défi pour ce faire, vous aurez besoin d'avoir l'équivalent d'une vtable pointeur dansBase
, contenant des pointeurs de fonction pour les fonctions qui acceptentBase
comme premier argument (que vous pouvez nommerthis
).Par quel point, vous pouvez aussi bien utiliser le C++!
personDAO->getPersonById(personDAO, personDTO->getId(personDTO));
. Malheureusement, je ne vois pas une autre manière autour.C n'a pas explicite du concept de l'héritage, à la différence de C++. Toutefois, vous pouvez réutiliser une structure dans une autre structure:
J'aime et a utilisé l'idée de Typesafe l'héritage en C.
Par exemple:
Utilisation:
leopard.base
, le point de l'ensemble de l'héritage/le polymorphisme est éliminé.leopard.base.felidae.base.animal.weight
etleopard.base.animal.weight
?leopard.base.felidae.base.animal.weight
est juste un autre nom pourleopard.base.animal.weight
- c'est la même chose à la même place en mémoire.Si vous souhaitez utiliser gcc magie (que je suppose serait de travailler avec Microsoft C compiler), vous pouvez faire quelque chose comme:
Avec gcc, vous pouvez le compiler avec -fms-extensions (Permet sans nom les membres de la structure comme Microsoft compilateur ne). Ceci est similaire à la solution donnée par Daniel Earwicker, sauf qu'il vous permet d'accéder à memeber1 sur une struct B exemple. j'.e B. member1 à la place de B. A. member1.
Ce n'est probablement pas le plus portable de l'approche et ne fonctionnera pas si vous utilisez un compilateur C++ (langage différent de la sémantique à dire que c'est redeclaring/définition des struct Un au lieu de l'instanciation).
Toutefois, si vous vivez dans le ccag/C des terres qu'il va travailler et de faire exactement ce que vous voulez.
Si votre compilateur prend en charge anonyme structs, vous pouvez le faire:
De cette façon, la base de stuct les membres peuvent être effectue directement, ce qui est plus agréable.
_t
est réservé dans POSIX. Faire ce que vous voulez, il suffit de noter que vous êtes confronté à des conflits si l'écriture de votre code pour un système POSIX (par exemple Linux) ou quelqu'un voudrait port votre code pour un système POSIX.-fms-extensions
.Vous pouvez le faire ci-dessus mentionné
Mais si vous voulez éviter de pointeur de la coulée, vous pouvez utiliser des pointeurs pour une
union
deBase
etDerived
.Cela fonctionne de la compilation avec -fms-extensions
Schéma de l'image
principal.c
AbstractProduct.c
AbstractProduct.h
Livre.c
Livre.h
Produit.c
Produit.h
TravelGuide.c
TravelGuide.h
Makefile
Une légère variation de la réponse de anon (et d'autres similaires). Pour un niveau de profondeur de l'héritage, on peut effectuer les opérations suivantes:
Cette façon, les fonctions d'accepter pointeur à Personne, va accepter pointeur vers l'Employé ou le Gestionnaire (casting), de même que dans d'autres réponses, mais dans ce cas, l'initialisation sera naturel ainsi:
vs
Je crois que c'est la façon dont certains des projets populaires le faire (par exemple. libuv)
Mise à JOUR: il y a aussi quelques bons exemples de semblable (mais pas le même concept dans libsdl événements de mise en œuvre en utilisant les structures et les syndicats.
name
etsex
champs, mais il y a d'autres possibilités. Le principal problème est qu'il n'existe aucune garantie que cela fonctionne, faisant de ce code non fiable, et donc inutilisable.C n'est pas un langage orienté objet et n'a donc aucun héritage.
Vous pouvez le simuler, mais vous ne pouvez pas vraiment hériter.
Non, tu ne peux pas.
omi, la meilleure approche de la programmation orientée objet en C est en utilisant ADT.
Non, vous ne le peut pas. C ne prend pas en charge le concept d'héritage.