Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

why can't I cast a pointer to Derived class member function to the same but of class Base?

To me it looks perfectly safe to cast a void(Derived::*)() to a void(Base::*)(), like in this code:

#include <iostream>
#include <typeinfo>
using namespace std;
struct Base{
    void(Base::*any_method)();
    void call_it(){
        (this->*any_method)();
    }
};
struct Derived: public Base{
    void a_method(){
        cout<<"method!"<<endl;
    }
};
int main(){
    Base& a=*new Derived;
    a.any_method=&Derived::a_method;
    a.call_it();
}

But the compiler complains about the cast at a.any_method=&Derived::a_method;. Is this a roadblock to prevent subtle programming errors, or just something to make life easier for compiler writers? Are there workarounds to let the Base class have a pointer to member functions of Derived without type knoweledge (that is, I cannot make Base a template with template argument Derived).

like image 947
Lorenzo Pistone Avatar asked Apr 15 '12 14:04

Lorenzo Pistone


People also ask

Can a base class pointer point to derived class?

Explanation: A base class pointer can point to a derived class object, but we can only access base class member or virtual functions using the base class pointer because object slicing happens when a derived class object is assigned to a base class object.

Why can't a derived pointer reference a base object?

similarly a derived object is a base class object (as it's a sub class), so it can be pointed to by a base class pointer. However, a base class object is not a derived class object so it can't be assigned to a derived class pointer.

How the base class reference can point to derived class object what are its advantages?

Conclusion: A pointer to derived class is a pointer of base class pointing to derived class, but it will hold its aspect. This pointer of base class will be able to temper functions and variables of its own class and can still point to derived class object.

Can the pointer of base class point to the object of its derived class if yes why C++ compiler supports this type incompatibility?

A derived class object should have information about contents of base class even then a pointer of derived class cannot point to object of base class.


1 Answers

What happens if your Derived::a_method() attempts to use a data member only present in Derived, not in Base, and you call it on a Base object (or an object derived from Base but not related to Derived)?

The conversion the other way around makes sense, this one doesn't.

like image 184
Mat Avatar answered Sep 19 '22 09:09

Mat