gpt4 book ai didi

c++ - 抽象类上的模板类

转载 作者:行者123 更新时间:2023-11-30 03:47:39 26 4
gpt4 key购买 nike

所以我有一个类模板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,您不再有通用接口(interface)类型;使用选项 2,FooBase不能为任何成员函数提供 T -依赖参数。


顺便说一下,不要忘记在真实代码中使用虚拟析构函数。

关于c++ - 抽象类上的模板类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33594105/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com