Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

calling virtual function through pointer to const base class

Tags:

c++

In the below program, the function 'f' in the base class A is hidden for the objects of derived class B. But when I call function f through const A *d which is pointing object of B, function f from the base class is getting invoked. If I remove const specifier for the pointer (i.e. A *d) function 'f' from derived class is called. My query how the constness is making a difference here ? Thanks for any help.

#include <iostream>

class A
{
public:
    virtual void f(int n) { std::cout << "A::f\n"; }
    virtual ~A() { }

    void f(int n) const { std::cout << "A::f const\n"; }
};

class B
    : public A
{
public:
    void f(int n) { std::cout << "B::f\n"; }

    void f(int n) const { std::cout << "B::f const\n"; }
};

int main()
{
    const A a;
    B b;
    A &c = b;
    const A *d = &b;

    c.f(1);
    d->f(1);


    return 0;
}

Output (with const A *d): B::f A::f const

Output (with A* d) B::f B::f

like image 909
irappa Avatar asked Nov 17 '25 00:11

irappa


1 Answers

The signature of the function to be called is determined on call site based on the static type of the pointer. The correct overrider of this signature is then chosen at runtime.

In other words, if you have this:

const A *d;
d->f(1);

then the f is searched for in const A. So it finds the non-virtual void f(int) const.

However, if you have this:

A *e;
e->f(1);

then the f is searched for in non-const A. So it finds virtual void f(int), which is then (at runtime) delegated to the final overrider void B::f(int).

EDIT

This follows from the rules on member function selection. When accessing through a const path (pointer or reference), only const member functions are applicable. When accessing through a non-const path, non-const functions are considered. Only if there is none is the pointer (or reference) implicitly converted to a pointer (or-reference) to const and then the const member functions are considered.

like image 165
Angew is no longer proud of SO Avatar answered Nov 19 '25 14:11

Angew is no longer proud of SO



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!