2017-10-12 18 views
0
class Base { int type; }; 
class Derived1 : public Base { ... }; 
class Derived2 : public Base { ... }; 
class Container 
{ 
public: 
    Derived1 f1; 
    Derived2 f2; 
}; 

Container c; 

size_t offset = (size_t) static_cast<Base*>(&reinterpret_cast<Container*>(0)->f2); 
Base* base = reinterpret_cast<Base*>((size_t) c + offset); // ok 

Base Container::* ptr = &Container::f2; // compile error! 
base = c.*ptr; 

Est-ce que la méthode la plus valide pour obtenir un pointeur vers Base à l'aide du pointeur vers un membre?C++ pointeur vers le membre (pointeur vers la classe de base du membre)

+0

Vous déréférencement un 'nullptr', donc le code a un comportement non défini. Peut-être que ['offsetof'] (http://en.cppreference.com/w/cpp/types/offsetof) est ce que vous voulez. – nwp

+0

Que 'reinterpret_cast (0)' est officiellement UB. Vous ne devriez pas l'utiliser à moins que la mise en œuvre ne vous le permette. C'est ce que 'offsetof' est pour. – StoryTeller

+0

Ce code est très confus. Même les parties que vous dites ne fonctionnent pas vraiment. 'Base Container :: * ptr' est un nom de type absurde et il est impossible de comprendre ce que vous voulez vraiment dire. Et dans le code où vous posez des questions sur une erreur de compilation, vous essayez de prendre l'adresse de quelque chose qui n'a même pas d'adresse. – Omnifarious

Répondre