2

私はインターフェースを持っており、次のように動的ポリモーフィズムの例を試していました:

#include <iostream>

using namespace std;

class foo{
    public:     
        virtual void set();
        virtual void printValue();
};

class fooInt : public foo{
        private:
            int i;
        public:
            int get(){ 
                return i;
            }   
            void set(int val){ //override the set
                i = val;
            }
            void printValue(){
                cout << i << endl;
            }           
};

int main(){
    foo *dt;         //Create a base class pointer
    dt = new fooInt; //Assign a sub class reference
    dt->set(9);
}

しかし、これをコンパイルすると、「foo::set(int)」の呼び出しに一致する関数が得られません。どこが間違っていますか?この記事を読んでみましたが、それでも間違いがわかりませんでした。

4

3 に答える 3

1

class fooメソッドはありませんset(int)。メソッドはありますが、メソッドset()はありませんset(int)

継承されたメソッドをオーバーライドする場合は、スーパークラス メソッドとメソッドのシグネチャが同じである必要があります。

class foo {
  ...
  // If you really want an abstract class, the `= 0`
  //  ensures no instances can be created (makes it "pure virtual")
  virtual void set(int) = 0;
  ...
}
于 2013-04-29T01:08:52.540 に答える
1

これは、あなたの定義のためです

    virtual void set(); 

する必要があります

    virtual void set(int val); 
于 2013-04-29T01:10:41.423 に答える
1

修正プログラムはこちら

#include <iostream>

using namespace std;

class foo {

public:
    virtual  void set(int val)=0;////////here you have void set() function with no argument but you tried to override void set(int val) which take one argument.
    virtual void printValue()=0;
};

class fooInt : public foo{
private:
    int i;
public:

    fooInt()
    {
        cout<<"constructor called\n";
    }
    int get(){
        return i;
    }
    void set(int val){ //override the set


        i = val;
    }
    void printValue(){
        cout << i << endl;
    }
};

int main(){


    foo *dt;       //Create a base class pointer
    dt=new fooInt;
    dt->set(9);
    dt->printValue();
}

以前のプログラムの障害は

1.set() {no argument} を set(int val){one argument} でオーバーライドしようとしました。2.クラスに純粋仮想関数が含まれている場合、その派生クラスによって実装する必要があります。3. 純粋仮想関数を含むクラスからオブジェクトを作成することはできませんが、ref は作成できます。ありがとう

于 2013-05-02T14:25:15.080 に答える