classe finale en c ++
class Temp
{
private:
~Temp() {}
friend class Final;
};
class Final : virtual public Temp
{
public:
void fun()
{
cout<<"In base";
}
};
class Derived : public Final
{
};
void main()
{
Derived obj;
obj.fun();
}
Le code ci-dessus tente de réaliser le non-héritées de la classe (finale). Mais à l'aide de code ci-dessus, l'objet des dérivés peuvent être créés, pourquoi?
La fonctionnalité désirée est obtenue que si ctor privé, ma question est pourquoi il n'est pas réalisable dans le cas de dtor privé?
source d'informationauteur Learner
Vous devez vous connecter pour publier un commentaire.
Bien, pour ce programme (pleasse corriger, compilable exemples)
Comeau, En Ligne dit
Depuis, dans le doute, j'ai toujours la confiance de côme (je n'ai jamais trouvé une erreur, mais de nombreux autres compilateurs), je suppose que VC9 (qui accepte le code) est dans l'erreur. (À partir de ce
void main()
je suppose que vous utilisez CR.)Noter que le non-héritées des classes existe pas en C++11 à l'aide de la
final
mot clé spécifié avant le: base1, base2, ..., baseN
liste d'héritage ou avant l'ouverture{
si la classe hérite de rien:Avec un peu de macro de la magie et certains compilateur de détection de l'effort de cette peut être abstrait de suite au travail, ou au pire ne rien faire, sur tous les compilateurs.
Curieusement récurrents de modèle de modèle. L'utilisation privée de l'héritage.
et vous devriez trouver qu'il est impossible de tirer quelque chose de X car le virtuel héritage signifie que la plupart de la classe dérivée doit construire la classe de base, mais il ne ont pas accès à elle.
(Je n'ai pas testé ce code).
Le C++ FAQ décrit différentes façons pour atteindre cet – mais à partir de votre question, je suppose que vous avez déjà lus. 😉
(Aussi,
main
faut toujours en revenirint
jamaisvoid
.)Et bien sûr la bonne façon de le faire aujourd'hui est d'utiliser le
final
mot-clé. Par exemple:La classe dérivée n'a pas appel privé destructeur de la classe de base, donc il n'a pas besoin de visibilité.
Faire votre constructeur privé et de fournir un générateur statique de la fonction.
J'ai modifié le code original publié et validé ce code dans g++:
Résultat:
$g++ one.cpp -o -lm -pthread -lgmpxx -kgmp -lreadline 2>,&1
one.cpp: Dans le constructeur 'Dérivée::Issu()':
un.rpc:8:9: erreur: 'Temp::Temp()' est privé Temp() {
.rpc:25:11: erreur: dans ce contexte
classe Dérivée: public Final
.rpc:11:9: erreur: 'Temp::~Temp()' est privé ~Temp() {}
.rpc:25:11: erreur: dans ce contexte
classe Dérivée : public Final
.rpc:11:9: erreur: 'Temp::~Temp()' est privé
~Temp() {}
Remarque: Il est recommandé de ne pas utiliser void avec 'main'.
Merci,