C++ inheritance and member function pointers -


in c++, can member function pointers used point derived (or base) class members?

edit: perhaps example help. suppose have hierarchy of 3 classes x, y, z in order of inheritance. y therefore has base class x , derived class z.

now can define member function pointer p class y. written as:

void (y::*p)(); 

(for simplicity, i'll assume we're interested in functions signature void f() )

this pointer p can used point member functions of class y.

this question (two questions, really) then:

  1. can p used point function in derived class z?
  2. can p used point function in base class x?

c++03 std, §4.11 2 pointer member conversions:

an rvalue of type “pointer member of b of type cv t,” b class type, can converted rvalue of type “pointer member of d of type cv t,” d derived class (clause 10) of b. if b inaccessible (clause 11), ambiguous (10.2) or virtual (10.1) base class of d, program necessitates conversion ill-formed. result of conversion refers same member pointer member before conversion took place, refers base class member if member of derived class. result refers member in d’s instance of b. since result has type “pointer member of d of type cv t,” can dereferenced d object. result same if pointer member of b dereferenced b sub-object of d. null member pointer value converted null member pointer value of destination type. 52)

52)the rule conversion of pointers members (from pointer member of base pointer member of derived) appears inverted compared rule pointers objects (from pointer derived pointer base) (4.10, clause 10). inversion necessary ensure type safety. note pointer member not pointer object or pointer function , rules conversions of such pointers not apply pointers members. in particular, pointer member cannot converted void*.

in short, can convert pointer member of accessible, non-virtual base class pointer member of derived class long member isn't ambiguous.

class { public:      void foo(); }; class b : public {}; class c { public:     void bar(); }; class d { public:     void baz(); }; class e : public a, public b, private c, public virtual d { public:      typedef void (e::*member)(); }; class f:public e { public:     void bam(); }; ... int main() {    e::member mbr;    mbr = &a::foo; // invalid: ambiguous; e's or b's a?    mbr = &c::bar; // invalid: c private     mbr = &d::baz; // invalid: d virtual    mbr = &f::bam; // invalid: conversion isn't defined standard    ... 

conversion in other direction (via static_cast) governed § 5.2.9 9:

an rvalue of type "pointer member of d of type cv1 t" can converted rvalue of type "pointer member of b of type cv2 t", b base class (clause 10 class.derived) of d, if valid standard conversion "pointer member of b of type t" "pointer member of d of type t" exists (4.11 conv.mem), , cv2 same cv-qualification as, or greater cv-qualification than, cv1.11) null member pointer value (4.11 conv.mem) converted null member pointer value of destination type. if class b contains original member, or base or derived class of class containing original member, resulting pointer member points original member. otherwise, result of cast undefined. [note: although class b need not contain original member, dynamic type of object on pointer member dereferenced must contain original member; see 5.5 expr.mptr.oper.]

11) function types (including used in pointer member function types) never cv-qualified; see 8.3.5 dcl.fct.

in short, can convert derived d::* base b::* if can convert b::* d::*, though can use b::* on objects of type d or descended d.


Comments

Popular posts from this blog

c++ - How do I get a multi line tooltip in MFC -

asp.net - In javascript how to find the height and width -

c# - DataTable to EnumerableRowCollection -