468,315 Members | 1,438 Online
Bytes | Developer Community
New Post

Home Posts Topics Members FAQ

Post your question to a community of 468,315 developers. It's quick & easy.

Pointer to protected member function from derived class

Hi all,

Consider the following code:
class A {
public:
A() {}
void DoMethod() { (this->*m_pMethod)(); }

protected:
virtual void MethodA() { ... }
virtual void MethodB() { ... }
void (A::*m_pMethod)();

};

class B1 : public A {
public:
B1() { m_pMethod = &A::MethodA; } // invokes B1::MethodA()
protected:
virtual void MethodA() { ... }

};

Class A has a member m_pMethod, which is pointer to a class member
function. This function can be over ridden by derived class (in my
example this is what B1 does). There more B2....Bn in the system.

This code was fine under gcc 3.2.3 but not ok under 4.1.2:
test.cc: In constructor 'B1::B1()':
test.cc:9: error: 'virtual void A::MethodA()' is protected
test.cc:17: error: within this context

Ok, after some googling I found it's related to gcc 3.4 changes -
http://www.gnu.org/software/gcc/gcc-...ges.html#3.4.6 (look for
"forming a pointer to member or a pointer to member function").

Setting B1() { m_pMethod = &B1::MethodA; } does not help too:
test.cc: In constructor 'B1::B1()':
test.cc:17: error: cannot convert 'void (B1::*)()' to 'void (A::*)()'
in assignment

Any ideas how to fix it?

BR
Dima
Jun 27 '08 #1
3 2854
Dmitry wrote:
Hi all,

Consider the following code:
[..]
Please have patience. If somebody knows the answer and is willing to
help, they'll reply. No need to post your inquiry again within 10
minutes of the original post *unless* you provide more information
(which you don't seem to here).

V
--
Please remove capital 'A's when replying by e-mail
I do not respond to top-posted replies, please don't ask
Jun 27 '08 #2
Dmitry wrote:
Hi all,

Consider the following code:
class A {
public:
A() {}
void DoMethod() { (this->*m_pMethod)(); }

protected:
virtual void MethodA() { ... }
virtual void MethodB() { ... }
void (A::*m_pMethod)();

};

class B1 : public A {
public:
B1() { m_pMethod = &A::MethodA; } // invokes B1::MethodA()
protected:
virtual void MethodA() { ... }

};

Class A has a member m_pMethod, which is pointer to a class member
function. This function can be over ridden by derived class (in my
example this is what B1 does). There more B2....Bn in the system.

This code was fine under gcc 3.2.3 but not ok under 4.1.2:
test.cc: In constructor 'B1::B1()':
test.cc:9: error: 'virtual void A::MethodA()' is protected
test.cc:17: error: within this context

Ok, after some googling I found it's related to gcc 3.4 changes -
http://www.gnu.org/software/gcc/gcc-...ges.html#3.4.6 (look for
"forming a pointer to member or a pointer to member function").
Other compilers agree with this. You can only take the address of
protected members of the base class, not of any other A's.
>
Setting B1() { m_pMethod = &B1::MethodA; } does not help too:
test.cc: In constructor 'B1::B1()':
test.cc:17: error: cannot convert 'void (B1::*)()' to 'void
(A::*)()' in assignment
It helps in that it takes the address of a function. Just not the
right one. :-)
>
Any ideas how to fix it?
Why is B1 setting a variable in A? Can you move that to a member
function of A (and make the pointer private)?
class A {
public:
A() {}
void DoMethod() { (this->*m_pMethod)(); }

protected:
virtual void MethodA() { ... }
virtual void MethodB() { ... }
void SelectMethodA()
{ m_pMethod = &A::MethodA; }

private:
void (A::*m_pMethod)();

};

class B1 : public A {
public:
B1() { SelectMethodA(); }
protected:
virtual void MethodA() { ... }

};
Bo Persson
Jun 27 '08 #3
On Jun 9, 2:39 pm, Dmitry <dim...@gmail.comwrote:
Consider the following code:
class A {
public:
A() {}
void DoMethod() { (this->*m_pMethod)(); }
protected:
virtual void MethodA() { ... }
virtual void MethodB() { ... }
void (A::*m_pMethod)();
};
class B1 : public A {
public:
B1() { m_pMethod = &A::MethodA; } // invokes B1::MethodA()
protected:
virtual void MethodA() { ... }
};
Class A has a member m_pMethod, which is pointer to a class
member function. This function can be over ridden by derived
class (in my example this is what B1 does). There more
B2....Bn in the system.
This code was fine under gcc 3.2.3 but not ok under 4.1.2:
test.cc: In constructor 'B1::B1()':
test.cc:9: error: 'virtual void A::MethodA()' is protected
test.cc:17: error: within this context
Ok, after some googling I found it's related to gcc 3.4 changes -http://www.gnu.org/software/gcc/gcc-3.4/changes.html#3.4.6(look for
"forming a pointer to member or a pointer to member function").
Setting B1() { m_pMethod = &B1::MethodA; } does not help too:
test.cc: In constructor 'B1::B1()':
test.cc:17: error: cannot convert 'void (B1::*)()' to 'void (A::*)()'
in assignment
Any ideas how to fix it?
Make the functions public. (I find almost no use for protected
anyway, except in closed hierarchies, and then, it's almost
always for data, and not functions.)

Provide a protected function in A which returns the desired
pointer to member. (Note that it cannot be a static function,
even though you don't access any members of the object, or
you'll run into the same problem. I think.) Or provide a
protected function which sets the member pointer to function to
the desired value.

Provide an additional virtual function in A which is overloaded
in the derived class to dispatch to whichever function is
desired.

Provide a helper object (possibly friend) in A which calls the
desired fucntion and which can be instantiated in B.

--
James Kanze (GABI Software) email:ja*********@gmail.com
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
Jun 27 '08 #4

This discussion thread is closed

Replies have been disabled for this discussion.

Similar topics

37 posts views Thread by Ben | last post: by
1 post views Thread by none | last post: by
13 posts views Thread by Adam H. Peterson | last post: by
6 posts views Thread by marco_segurini | last post: by
2 posts views Thread by t | last post: by
7 posts views Thread by WaterWalk | last post: by
3 posts views Thread by Dan Smithers | last post: by
reply views Thread by NPC403 | last post: by
reply views Thread by Teichintx | last post: by
By using this site, you agree to our Privacy Policy and Terms of Use.