C++HowTo:从抽象专用模板继承的非模板类
C++ HowTo: Non-template class inheriting from an abstract specialized template
我有一个非模板抽象基类,它是用来引用基类型的,因为非专用的模板类型不能用作方法参数。
#ifndef RPCPP_ICALLBACKBASE_H
#define RPCPP_ICALLBACKBASE_H
#include <string>
namespace rpcpp
{
class ICallbackBase
{
public:
virtual ~ICallbackBase() {};
virtual void OnSuccess(void result) = 0;
virtual void OnError(std::string error) = 0;
};
}
#endif // RPCPP_ICALLBACKBASE_H
抽象模板类ICallback继承自ICallback库,如下所示:
#ifndef RPCPP_ICALLBACK_H
#define RPCPP_ICALLBACK_H
#include "ICallbackBase.h"
namespace rpcpp
{
template <class T>
class ICallback : public ICallbackBase
{
public:
virtual ~ICallback() {};
virtual void OnSuccess(T result) = 0;
virtual void OnError(std::string error) = 0;
};
}
#endif // RPCPP_ICALLBACK_H
最后,可以通过继承ICallback创建一个具体类型:
#ifndef RPCPP_SAMPLE_CALLBACK_H
#define RPCPP_SAMPLE_CALLBACK_H
#include "ICallback.h"
#include <iostream>
namespace rpcpp
{
class SampleCallback : public ICallback<double>
{
public:
~SampleCallback() {};
virtual void OnSuccess(double result)
{
std::cout << "Successfully executed a remote procedure, A + B = " << result << "rnrn";
}
virtual void OnError(std::string error)
{
std::cout << "Error while executing a remote procedure: " << error << "rnrn";
}
};
}
#endif // RPCPP_SAMPLE_CALLBACK_H
所有这些都编译得很好,但当我尝试使用它时,就像这样:
rpcpp::SampleCallback sc;
sic.CalculateMean(15, 28, &sc); // Third argument of this method is expected to be ICallbackBase&.
它会产生以下两个错误:
第1行中的"无法实例化抽象类"。第2行中的"无法将参数3从SampleCallback&转换为ICallbackBase&"
我做错了什么?
virtual void OnSuccess(void result) = 0;
从未定义。
您并没有实现所有抽象方法:
virtual void OnSuccess(void result)=0;
CalculateMaven的定义是什么?
以下是如何解决实际问题:
从OnSuccess:中删除参数
virtual void OnSuccess()=0;
向ICallback:添加构造函数参数
template<class T> class ICallBack
{
public:
ICallBack(T &result) : result(result) { }
protected:
T &result;
};
添加新方法以允许非模板代码访问T内部表示:
virtual void *Address() const=0;
virtual size_t Size() const=0;
virtual type_info Type() const=0;
在ICallBack<T>
:中实现这些方法
void *Address() const { return &result; }
size_t Size() const { return sizeof(T); }
type_info Type() const { return typeid(T); }
相关文章:
- 从抽象类继承以创建另一个抽象类时,我应该重新声明所有虚函数吗?
- 抽象类析构函数与继承"Shutdown"函数
- 工厂方法模式使用继承而抽象工厂模式使用组合如何
- C++ 多重继承:使用基类 A 的实现实现基类 B 的抽象方法
- C++的抽象类继承和构造函数的问题
- 自定义异常中的用户定义的空构造函数,具有多个继承和抽象基类
- C++:抽象类继承和构造
- 使用空基类强制继承抽象工厂的做法是不好的吗?
- 私下继承C++抽象基类是什么意思
- 抽象类 A 由类 C 继承"through"类 B "intermediary"。如何声明虚拟功能?
- 如何修复抽象类的迭代继承
- 具有继承类和函数的抽象类写入单独的向量c++
- 继承自C++中的抽象类
- C++抽象类和继承
- 继承抽象的基础接口及其实现给出了C2259
- 如何从 c++ 基类继承抽象行为
- 如何使用继承(抽象基类)实现移动构造函数和移动赋值运算符
- 多重继承抽象类
- C++ 继承抽象函数
- c++元编程:必须继承抽象类的模板参数