抽象类上的模板类
Template class on a abstract class
本文关键字:抽象类 更新时间:2023-10-16
所以我有一个类模板Foo
:
template <typename T>
class Foo
{
public:
Foo();
~Foo();
//...
};
我有两个来自Foo类的派生类:
class FooDerived1 : public Foo<int>
{
public:
FooDerived1 ();
~FooDerived1 ();
};
class FooDerived2 : public Foo<double>
{
public:
FooDerived2 ();
~FooDerived2 ();
};
但现在我看到类模板正在一个抽象类IBar
上使用,如下所示:
class Foo;
class IBar
{
public:
virtual void placeFoo(Foo& foo) = 0; //error
virtual void removeFoo(Foo& foo) = 0;
};
我知道我不能在抽象虚拟类中使用模板类
但是。。在这种情况下,我该怎么办
我真的需要像这样的IBar抽象类。。。
忘记使用模板类吗
选项1:使IBar
本身成为一个模板类。
template <class T>
class Foo;
template <class T>
class IBar
{
public:
virtual void placeFoo(Foo<T>& foo) = 0;
virtual void removeFoo(Foo<T>& foo) = 0;
};
选项2:使所有Foo<T>
都派生自一个通用的、非通用的FooBase
。
class FooBase
{
// ...
};
template <typename T>
class Foo : public FooBase
{
public:
Foo();
~Foo();
//...
};
// ...
class FooBase;
class IBar
{
public:
virtual void placeFoo(FooBase& foo) = 0;
virtual void removeFoo(FooBase& foo) = 0;
};
两种解决方案的可行性取决于您实际对T
类型的依赖程度。但是,当您将虚拟函数与模板混合使用时,您应该预料到这一点。有了选项1,您就不再有通用的接口类型了;对于选项2,FooBase
不能为任何具有T
相关参数的成员函数提供。
顺便说一句,不要忘记真实代码中的虚拟析构函数。
如果需要通用行为,请为Foo<>
:的所有实例创建基类
class FooBase
{
//common interface and data
};
template <class T>
class Foo : public FooBase
{
};
然后:
class FooBase;
class IBar
{
public:
virtual void placeFoo(FooBase& foo) = 0; //ok
virtual void removeFoo(FooBase& foo) = 0;
};
问题是,你试图混合模板(编译时)和动态多态性(运行时),这可能会有问题(这是你所说的"我知道我不能在抽象虚拟类中使用模板类"的意思吗?)。
为什么不坚持使用模板呢?
class IBar
{
public:
template <class T>
void placeFoo(Foo<T>& foo);
template <class T>
void removeFoo(Foo<T>& foo);
};
或:
template <class T>
class IBar
{
public:
void placeFoo(Foo<T>& foo);
void removeFoo(Foo<T>& foo);
};
相关文章:
- 无法创建抽象类的实例
- 用pybind11包装C++抽象类时出错
- 如何处理从一个对象传递到另一个在C++中具有公共抽象类的对象的消息
- 有没有办法按值将纯抽象类的所有子类传递给 C++ 中的函数?
- 抽象类错误,请参阅声明" "是抽象的
- 将自定义函数传递到基抽象类中以延迟执行
- 将包含抽象类和普通类C++包导出到 Python
- C++:处理抽象类中的错误时出现问题
- C ++如何在原始抽象类中创建一个函数,该函数接受派生类的输入
- 在 C++ 中使用另一个头文件中的抽象类
- ATL::CComContainedObject<contained>: C2259 无法实例化抽象类
- C++:从抽象类重写纯虚拟运算符重载
- 如何创建shared_ptr抽象类的容器
- .h 或.cpp文件中的抽象类或两者兼而有之?
- 从抽象类继承以创建另一个抽象类时,我应该重新声明所有虚函数吗?
- E0322:不允许使用抽象类类型 " " 的对象
- 可视抽象类 c++(错误 LNK 2001:未解析的外部符号)
- 提升 - 类没有名为"序列化"的成员(抽象类)?
- 如何将子类作为函数的参数传递给期望基类,然后将该对象传递到指向这些抽象类对象的指针向量中?
- 对纯抽象类中方法的未定义引用