Une erreur s'est produite lorsque j'essaie d'accéder à la disposition de la mémoire d'un objet de classe dérivé qui hérite d'une classe de base virtuelle.
environnement de programmation: GNU/Linux 3.19.0-32-générique, x86_64
compilateur: gcc 4.8.4Qu'est-ce qu'un "thunk virtuel" à une fonction virtuelle qui hérite d'une classe de base virtuelle?
//virtual base class
class Base {
public :
virtual void f() {
cout << "Base::f()" << endl;
}
private:
long x;
};
//derived class
class Derived : public virtual Base {
public:
virtual void f() {
cout << "Derived::f()" << endl;
}
private:
long y;
};
int main() {
typedef void (*FUNC)(void);
Derived d;
//In my machine, sizeof(long) == sizeof(pointers). My code below is neither portable nor concise. You can just read the annotation.
//dereference the first element of the first virtual function table(equals to *(vptr1->slot[0]))
cout << hex << *((long*)*((long*)(&d) + 0) + 0) << endl;
((FUNC)*((long*)*((long*)(&d) + 0) + 0))();//invoke Derived::f()
//dereference the first element of the second virtual function table(equals to *(vptr2->slot[0]))
cout << hex << *((long*)*((long*)(&d) + 2) + 0) << endl;
((FUNC)*((long*)*((long*)(&d) + 2) + 0))();//maybe Derived::f()?
return 0;
}
Quand je lance le code, je me suis "faute de segment":
400c12
Derived::f()
400c3c
segment fault
Donc je désassemble le fichier exécutable.
Je trouve la fonction < _ZTv0_n24_N7Derived1fEv> dans 0x400c3c:
0000000000400c3c <_ZTv0_n24_N7Derived1fEv>:
400c3c: 4c 8b 17 mov (%rdi),%r10
400c3f: 49 03 7a e8 add -0x18(%r10),%rdi
400c43: eb cd jmp 400c12 <_ZN7Derived1fEv>
400c45: 90 nop
demangle le symbole dans mon terminal:
> c++filt _ZTv0_n24_N7Derived1fEv
virtual thunk to Derived::f()
Alors ce qui est un thunk virtuel à Derived :: f() Pourquoi est-il Là?
Votre question «qu'est-ce qu'un thunk virtuel» ou «pourquoi se sépare-t-elle? – xtofl
@xtofl le premier. – linvoker
Pourquoi essayez-vous de faire cela? –