サブクラスでオーバーライドされている関数からスーパークラスでオーバーライドされた関数を呼び出すにはどうすればよいですか?
例: クラス super には foo という関数があり、これは sub というサブクラスでオーバーライドされます。
サブクラスでオーバーライドされている関数からスーパークラスでオーバーライドされた関数を呼び出すにはどうすればよいですか?
例: クラス super には foo という関数があり、これは sub というサブクラスでオーバーライドされます。
継承を活用できます!
class A
{
public:
virtual void Foo()
{
// do some base class foo-ing
}
};
class B : public A
{
public:
virtual void Foo()
{
// do some subclass foo-ing
// to call the super-class foo:
A::Foo( );
}
};
void main()
{
B obj;
obj.Foo( );
// This is if you want to call the base class Foo directly using the instance obj
A* handle = &obj;
handle->Foo( );
}
オーバーロードではなく、オーバーライドについて話していると思います。関数への修飾された呼び出しは、動的ディスパッチ メカニズムを使用せず、どのオーバーライドを選択するかを制御できます。
struct base {
virtual void foo() {...}
};
struct derived : base {
virtual void foo() {
base::foo(); // call the override at 'base' level
...
}
};
本当にオーバーロードについて話している場合は、同じメカニズムを使用するか、オーバーロードを派生型のスコープに入れることができます。
struct base {
void foo(int);
};
struct derived : base {
using base::foo; // make all overloads of base::foo available here
void foo(double);
void f() { base::foo(1); } // alternatively qualify the function call
};
You can use super::foo. For example:
#include <stdio.h>
class A
{
public:
void foo(void)
{
printf("Class A\n");
}
};
class B : public A
{
public:
void foo(void)
{
printf("Class B\n");
A::foo();
}
};
int main ()
{
B b;
b.foo();
}