以下のプログラムでは、基本クラス A の関数 'f' は、派生クラス B のオブジェクトに対して非表示になっています。しかし、B のオブジェクトを指している const A *d を介して関数 f を呼び出すと、基本クラスの関数 f は呼び出されます。ポインターの const 指定子 (つまり A *d) を削除すると、派生クラスから関数 'f' が呼び出されます。ここで constness がどのように違いを生んでいるかという私の質問は? 助けてくれてありがとう。
#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;
}
出力 (const A *d を使用): B::f A::f const
出力 (A* d を使用) B::f B::f