0
#include<iostream>
#include<conio.h>
using namespace std;
class Base;
typedef void (Base::*function)();
class Base
{
public:
    function f;
    Base()
    {
        cout<<"Base Class constructor"<<endl;
    }
    virtual void g()=0;
    virtual void h()=0;
};
class Der:public Base
{
public:
    Der():Base()
    {
        cout<<"Derived Class Constructor"<<endl;
        f=(function)(&Der::g);
    }
    void g()
    {
        cout<<endl;
        cout<<"Function g in Derived class"<<endl;
    }
    void h()
    {
        cout<<"Function h in Derived class"<<endl;
    }
};
class Handler
{
    Base *b;
public:
    Handler(Base *base):b(base)
    {
    }
    void CallFunction()
    {
        cout<<"CallFunction in Handler"<<endl;
        (b->*f)();
    }
};
int main()
{
    Base *b =new Der();
    Handler h(b);
    h.CallFunction();
    getch();
}

基本クラスで宣言された関数ポインターを使用して派生クラスでメンバー関数を呼び出そうとすると、エラーが発生します。関数ポインターはパブリックとして宣言され、実際には別のクラス Handler によって使用されます。このコードでは、安全でない型キャストを使用しています。(関数)(&Der::g)。それを回避する方法はありますか?

4

1 に答える 1

2

fの範囲内にないようHandler::CallFunctionです。b->f使用をbasthisと呼ぶつもりだったと思います(b->*(b->f))()。この変更を行うと、コードがコンパイルされ、正常なものが出力されます。

于 2013-01-15T07:08:12.840 に答える