1

次のコードがあります

Classes.h

#ifndef CLASSES_H
#define CLASSES_H

#include <iostream>
using namespace std;



template< class T1, class T2>
class class1
{
      public:
             virtual void method1(int) const =0;
             virtual void method2(class1&) const =0;
};


template< class T1>
class class2:public class1<T1,int>
{
      public:
             void method1(int) const;
             void method2(class2&) const;
};


template< class T1>
void class2<T1>::method1(int i) const
{
     cout<<"class2::method1 - before Call %i"<<endl;
     cout<<"class2::method1 - after Call"<<endl;
}

template< class T1>
void class2<T1>::method2(class2& c2) const
{
     cout<<"class2::method2 - before Call"<<endl;
     cout<<"class2::method2 - after Call"<<endl;
}

#endif

main.cpp

#include <cstdlib>

#include <iostream>
using namespace std;

#include "Classes.h" 

int main(int argc, char *argv[])
{
    class2<int> c2;

    c2.method1(0);
    c2.method2(c2);

    system("PAUSE");
    return EXIT_SUCCESS;
}

基本的に、C1 はインターフェイス クラスであるため、そのメソッドは純粋に仮想です。発生している問題は、Medhod2 がクラス自体のインスタンス (インターフェイスの場合は class1、そのようなインターフェイスを実装するクラスの場合は class2) を渡すことです。

したがって、Method2 には署名があります

void method2(class1&) const;

class1 で

void method2(class2&) const;

クラス2で。

これが、コンパイル時に以下のエラーが発生する理由です。

main.cpp: In function `int main(int, char**)':
main.cpp:12: error: cannot declare variable `c2' to be of type `class2<int>'
main.cpp:12: error:   because the following virtual functions are abstract:
Classes.h:14: error:  void class1<T1, T2>::method2(class1<T1, T2>&) const [with
T1 = int, T2 = int]
make: *** [main.o] Error 1

この問題を解決するにはどうすればよいですか?

誰か教えてください。ありがとう。

4

2 に答える 2

2

あなたの問題は、仮想署名が一致する必要があることです(戻り値の型は共変になる可能性がありますが、それ以外の場合、署名は同じでなければなりません)。class2void method2(class2&) const;を に変更しvoid method2(class1&) const;ます。

または、仮想メソッドを非表示にして、代わりのメソッドを提供します。

class class2
{
    // must be implemented since pure virtual, but now private
    void method2(class1&) const; 
public:
    void method1(int) const;
    void method2(class2&) const;
};
于 2013-03-20T17:34:25.547 に答える
1

設計上の問題があります。法案に一致するすべての引数、つまり type へのすべての参照に対して機能class1::method2(class1&) constする必要があります。type の引数に対してしか実装できない場合、構文的にも論理的にも不完全です: 意図した用途に対処する方法はありません。class1class2method2()class2

class2 A;
class1*B = method_returning_pter_to_class1_object();
A.method2(*B);                         // intended usage of virtual function

(このタイプの使用を意図していない場合は、設計にclass1欠陥があります。)

もちろんdynamic_cast、引数が実際に type の場合、 a を使用して特別な動作を呼び出すclass2&ことができます。

void class2::method(class1&x) const
{
  class2*x2 = dynamic_cast<class2*>(&x);
  if(x2)
    apply_method_taking_class2(*x2);
  else
    apply_method_for_other_than_class2_object(x);
}

ただし、これにより実行時のペナルティが発生する可能性があります。

于 2013-03-20T18:08:38.560 に答える