3

私は信じられないほどばかげたことをしているように感じますが、自分のコードの何が問題なのかわかりません。コードの非常に単純化されたバージョンを作成しても、エラーは引き続き発生します。

#include <iostream>

using namespace std;

class c1{
public:
    c1(){}
    ~c1(){}

    virtual int add(int a, int b);

private:
protected:


};

class c2 : c1{
public:
    c2(){}
    ~c2(){}

    int add(int a, int b){
        return a+b;
    }

};

int main(){

    c2 c;
    c.add(5,6);

}

これまでで最もばかげたエラーであると私が確信しているものを誰か見つけることができますか?

正確なエラーメッセージは次のとおりです。

1>main.obj : error LNK2001: unresolved external symbol "public: virtual int __thiscall c1::add(int,int)" (?add@c1@@UAEHHH@Z)
4

6 に答える 6

12
virtual int add(int a, int b);

これは純粋仮想関数の宣言ではありません。これは単なる仮想関数の宣言です。定義がないため、エラーが発生します。

virtual int add(int a, int b) = 0;

これは純粋仮想関数の宣言です。定義は必要ないため、エラーは発生しません。

于 2013-01-17T13:55:32.953 に答える
2

が実装されていないため、リンカー エラーが発生してc1::add(int,int)います。純粋な仮想にするか、実装します。

于 2013-01-17T13:54:57.220 に答える
2

c1::add()純粋な仮想ではなく、実装されていません。これは、リンカがボディを探すのが正しいこと、ボディが見つからない場合に文句を言うのが正しいことを意味します。あなたはおそらくこれを意味しました:

class c1{
public:
    c1(){}
    ~c1(){}

    virtual int add(int a, int b) = 0;  // adding = 0 makes the function pure virtual

private:
protected:


};
于 2013-01-17T13:55:57.543 に答える
1

c1.add は純粋な仮想ではないため、= 0を追加する必要があります。

virtual int add(int a, int b) = 0; 
于 2013-01-17T13:54:54.920 に答える
1

仮想 int add(int a, int b) を変更します。仮想 int に add(int a, int b) = 0;

于 2013-01-17T13:55:37.290 に答える
1

virtual int add(int a, int b); これは、「私の関数addをサブクラス化できる」ことを意味します。「私の関数addはサブクラス化でき、純粋な仮想です」であるためには、他の必要があります

virtual int add(int a, int b) = 0;
于 2013-01-17T13:56:41.437 に答える