En C++, quand une fonction virtuelle peut-elle utiliser une liaison statique? Si on y accède par un pointeur, on y accède directement ou jamais?En C++ si une fonction membre est virtuelle quand la liaison statique peut-elle être utilisée?
Répondre
La liaison statique ne peut être effectuée que lorsque le type de l'objet est totalement non ambigu à la compilation. Je ne peux penser qu'à quatre endroits où le type d'un objet abstrait est sans ambiguïté: dans le constructeur, dans le destructeur, lorsqu'il est déclaré localement et dans la même portée qu'une allocation dynamique. Je ne connais pas très bien le standard, donc je ne peux pas dire ce qu'il dit à propos de ces quatre possibilités (je dirais que les deux premiers sont liés statiquement, le troisième possible statiquement et le dernier non, bien qu'il soit probablement indéfini ou dépendante de l'implémentation). En dehors de ces points, l'objet auquel on accède via un pointeur de classe de base peut pointer vers une classe dérivée et l'unité de traduction actuelle n'a aucun moyen de le savoir. La liaison statique n'est donc pas possible. La fonction peut être appelée avec un pointeur vers la classe de base dans une instance et un pointeur vers une classe dérivée dans une autre!
Si vous voulez appeler la version de classe de base d'une fonction, vous pouvez le faire en nommant explicitement la classe de base:
class Base
{
public:
virtual ~Base() {}
virtual void DoIt() { printf("In Base::DoIt()\n"); }
};
class Derived : public Base
{
public:
virtual void DoIt() { printf("In Derived::DoIt()\n"); }
};
Base *basePtr = new Derived;
basePtr->DoIt(); // Calls Derived::DoIt() through virtual function call
basePtr->Base::DoIt(); // Explicitly calls Base::DoIt() using normal function call
delete basePtr;
Hah, j'étais en train de taper presque exactement le même post! Upvoted le vôtre. –
Lorsqu'une méthode virtuelle est appelée par un pointeur ou une référence, la liaison dynamique est utilisé. A tout autre moment, la liaison à la compilation est utilisée. Ex:
class C;
void Foo(C* a, C& b, C c) {
a->foo(); // dynamic
b.foo(); // dynamic
c.foo(); // static (compile-time)
}
- 1. Liaison statique en C#
- 2. Pointeur de fonction C++ (membre de la classe) vers la fonction de membre non statique
- 3. Pointeur de fonction C++ en tant que membre statique
- 4. Comment/devrait être caché la variable et la fonction de membre statique C++?
- 5. Est-il possible d'obtenir une liaison anticipée/statique en utilisant des pointeurs de fonction en C++? Si oui alors comment?
- 6. C#: Inherited/interface membre statique?
- 7. Appel d'une fonction membre statique d'un conteneur STL C++ valeur_type
- 8. Est-il possible d'appeler une fonction non statique à l'intérieur d'une fonction statique en C#?
- 9. Comment initialiser un membre statique en C++ à l'aide de la fonction
- 10. Liaison à une variable membre
- 11. Variable statique/membre
- 12. C++: comment une fonction membre statique publique peut-elle accéder à des variables de membre d'instance privée?
- 13. Que signifie "opérateur = doit être un membre non statique"?
- 14. C++: Masquer le membre statique de base
- 15. C++ modèle initialisation pointeur à membre statique
- 16. Une fonction bash peut-elle être utilisée dans différents scripts?
- 17. En C#, comment savoir si une propriété est statique? (.Net CF 2.0)
- 18. Problème de liaison d'une bibliothèque statique C++
- 19. Comment configurer une fonction C++ pour qu'elle puisse être utilisée par p/invoke?
- 20. En C++ est-il possible d'avoir une fonction purement virtuelle définie?
- 21. Une application winform peut-elle être basculée vers une application WPF si l'architecture MVC est utilisée?
- 22. Webcam virtuelle en C++
- 23. La meilleure méthode pour avoir une fonction membre C++ est appelée par un rappel C?
- 24. Demandez à ActiveDirectory si une machine est membre d'un groupe
- 25. Une méthode peut-elle être utilisée comme une fonction array_map en PHP 5.2?
- 26. Test si la valeur est une fonction
- 27. Liaison statique à une bibliothèque dynamique. glibc
- 28. Comment initialiser un membre statique
- 29. Peupler un conteneur de membre statique dans C++
- 30. PHP print_r et membre statique
L'optimiseur peut fusionner différentes étendues via l'inlining. Si le type est connu dans l'une de ces portées, il sera connu dans la portée fusionnée. – MSalters