0

したがって、C ++でオーバーロードしようとしたときにこの問題が発生しました:これらのクラスがあります:

class Data
{
public:
    void virtual f(){cout<<"In data!"<<endl;}
};

class A: public Data
{
public:
    void f(int x){cout<<"Class A int is: "<<x<<endl;}

};

それから私は:

Data *D=new A();
D->f(4);

仮想で行ったので、データの f() 関数がクラス A の f() 関数に対して行うことを期待していますが、そうではありません。

それを機能させる方法はありますか?

4

3 に答える 3

7

これは同じ関数ではありません。派生クラスの関数はintパラメーターを取ります。

Dataと呼ばれるメソッドがないため、コンパイルすることさえできませんf(int)

ポリモーフィズムが機能するには、同じ署名が必要です。

class Data
{
public:
    void virtual f(int){cout<<"In data!"<<endl;}
    //              |
    //        dummy parameter
};

class A: public Data
{
public:
    void f(int x){cout<<"Class A int is: "<<x<<endl;}
};
于 2012-05-28T07:46:07.747 に答える
0

オーバーロードするときは、同じパラメーターが必要です。コンパイラは、doStuff(int a)、doStuff(String a)、およびdoStuff()を異なる関数と見なします。オーバーロードするときは、それらがすべて同じパラメーターを持っていることを確認してください。

于 2012-05-28T07:57:00.067 に答える
0

オーバーロードは、クラスの境界を越えては機能しません。クラスAのオブジェクトを使用して両方を呼び出すことができるようにするためにできることは次のとおりです-

class Data
{
public:
    void virtual f(){cout<<"In data!"<<endl;}
    //              |
    //        dummy parameter
};

class A: public Data
{
    using Data::f;

public:
    void f(int x){cout<<"Class A int is: "<<x<<endl;}
};
于 2012-05-28T07:59:29.160 に答える