Cette question est l'un des grands doutes qui plane dans ma tête et il est également difficile de le décrire en termes de mots. Parfois, elle semble évidente et parfois, elle est difficile à résoudre :
class Base{
public:
int a\_number;
Base(){}
virtual void function1() {}
virtual void function2() {}
void function3() {}
};
class Derived:public Base{
public:
Derived():Base() {}
void function1() {cout << "Derived from Base" << endl;
virtual void function4() {cout << "Only in derived" << endl;}
};
int main(){
Derived \*der\_ptr = new Derived();
Base \*b\_ptr = der\_ptr; // As just address is being passed , b\_ptr points to derived object
b\_ptr -> function4(); // Will Give Compilation ERROR!!
b\_ptr -> function1(); // Calls the Derived class overridden method
return 0;
}
Q1. Bien que b_ptr pointe vers un objet dérivé, à quel VTABLE accède-t-il et COMMENT ? car b_ptr -> function4() donne une erreur de compilation. Ou est-ce que b_ptr ne peut accéder qu'à la taille de la classe de base VTABLE dans le VTABLE dérivé ?
Q2. Étant donné que la disposition de la mémoire de la classe dérivée doit être (Base,Derived) , le VTABLE de la classe Base est-il également inclus dans la disposition de la mémoire de la classe dérivée ?
Q3. Puisque la fonction1 et la fonction2 de la classe de base Vtable pointe vers l'implémentation de la classe de base et la fonction2 de la classe dérivée pointe vers la fonction2 de la classe de base, y a-t-il vraiment un besoin de VTABLE dans la classe de base ? (C'est peut-être la question la plus stupide que je puisse poser, mais je suis toujours dans le doute à ce sujet dans mon état actuel et la réponse doit être liée à la réponse de Q1 :) )
Veuillez commenter.
Merci de votre patience.