__declspec(delphiclass)

De Appmethod Topics
Aller à : navigation, rechercher

Remonter à Liste alphabétique des mots clés - Index


Catégorie

Modificateurs, Extensions des mots clés, Spécificateurs de classe de stockage

Syntaxe

__declspec( delphiclass ) declarator

Description

L'argument delphiclass est utilisé pour déclarer des classes de style Object Pascal. De telles classes sont créées avec la compatibilité suivante :

  • RTTI compatible Pascal Objet
  • Gestion des exceptions compatible Object Pascal
  • Comportement du constructeur / destructeur compatible Object Pascal
  • Les procédures AfterConstruction et BeforeDestruction (code qui serait placé dans les classes C++ normales, respectivement dans les constructeurs et les destructeurs).

Voici les restrictions pour les classes de style Object Pascal :

  • Les classes de base virtuelles sont interdites.
  • Pas d'héritage multiple sauf pour le cas décrit dans Héritage et interfaces.
  • Elle doit être allouée dynamiquement en utilisant l'opérateur global new.
  • Les instances de style Object Pascal sont initialisées à zéro, de telle sorte que leur état soit défini avant l'exécution d'un constructeur ou d'une méthode. Sans cette fonctionnalité, l'invocation de méthodes avant les constructeurs peut conduire à des résultats imprévisibles.
  • Les constructeurs de copie et les opérateurs d'affectation ne sont pas générés par le compilateur pour les classes dérivées de style Object Pascal.
  • Une déclaration de classe forward qui est traduite depuis Pascal Objet requiert le modificateur delphiclass si le compilateur doit savoir que la classe est de style Object Pascal. Par exemple, si l'ID de la classe ou une autre information RTTI est nécessaire avant la définition de la classe.

Autres remarques :

  • A l'inverse des classes C++ normales, les constructeurs et les destructeurs des classes de base de style Object Pascal peuvent invoquer des méthodes virtuelles et exécuter les implémentations "les plus dérivées". Il est ainsi possible qu'une méthode d'une classe soit exécutée avant un constructeur.

Exemple

L'exemple suivant déclare une classe de style Object Pascal avec une méthode de classe qui renvoie le nom de la classe.

 #include <System.hpp>
 #include <stdio.h>
 #include <tchar.h>
 
 class __declspec(delphiclass) TLock {
 public:
 	__classmethod UnicodeString GetClsName() {
 		return this->ClassName();
 	}
 };
 
 int _tmain(int argc, _TCHAR* argv[]) {
 	printf("%ls", TLock::GetClsName().c_str()); // displays TLock
 	return 0;
 }

Voir aussi