我有以下代码
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;
在class2中。
这就是我在编译时遇到以下错误的原因。
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
如何解决此问题?
有人可以告诉我吗?感谢。
答案 0 :(得分:2)
您的问题是虚拟签名需要匹配(返回类型可以是共变体,但签名应该相同)。将class2的void 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;
};
答案 1 :(得分:1)
您有设计问题:class1::method2(class1&) const
必须适用于匹配帐单的任何参数,即每次引用class1
类型。如果class2
只能为method2()
类型的参数实现class2
,那么它不仅在语法上而且在逻辑上都是不完整的:它无法处理预期用途
class2 A;
class1*B = method_returning_pter_to_class1_object();
A.method2(*B); // intended usage of virtual function
(如果您不打算使用此类用法,那么class1
中的设计存在缺陷。)
当然,如果参数实际上是dynamic_cast
类型,你可以使用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);
}
但这可能会导致一些运行时间的惩罚。