1

派生クラスが戻り値の型が異なる仮想関数を実装するクラス階層が必要です。どうすればできますか。私が試したのは次のコードです:

using namespace std;
class Base
{
public:
    Base()
    {
        cout<<"Constructor of Base"<<endl;
    }
    virtual Base& Decode()=0;
    virtual operator int(){return -1;}
    virtual operator string(){return "WRONG";}
};
class Der1:public Base
{
    int i;
public:
    Der1(int j=0):Base(),i(j)
    {
        cout<<"COnstructor of Der1"<<endl;
    }
    Base& Decode()
    {
        cout<<"Decode in Der1"<<endl;
        return *this;
    }
    operator int()
    {
        return i;
    }
};
class Der2:public Base
{
    string s;
public:
    Der2(string temp="sajas"):Base(),s(temp)
    {
        cout<<"Constructor of Der2"<<endl;
    }
    Base& Decode()
    {
        cout<<"Decode in Der2"<<endl;
        return *this;
    }
    operator string()
    {
        return s;
    }
};
int main()
{
    Base *p=new Der1();
    int val=p->Decode();
}

このように機能するかどうかは、ユーザーがオブジェクトを有効な変数と同等にするだけでよいと考えていました。Base にすべての変換演算子をダミーの実装で含めずにそれを行う方法はありますか?

4

1 に答える 1

0

1 つ問題があると思いますが、純粋仮想関数の場合、クラス ベースのオブジェクトを作成できません。しかし一方で、問題を解決するために、以下のようなテンプレートを使用して試すことができます。

#include <iostream>

class Base{
public:
    Base(){}
    virtual ~Base(){}
    virtual void show() const {
        std::cout << "Base::show()!" << std::endl;
    }
};
class A:public Base{
public:
    A(){}
    virtual ~A(){}
    virtual void show() const{
        std::cout << "A::show()!" << std::endl;
    }
};

template<typename T>
class Factory{
public:
    const T* operator()() const{
        return &t;
    }
private:
    T t;
};

int main(){
    const A* pA = Factory<A>()();
    pA->show();
    Factory<A>()()->show();
    return 0;
} 
于 2013-03-11T04:13:20.887 に答える