gpt4 book ai didi

c++ - 模板类中是否允许纯虚方法?

转载 作者:IT老高 更新时间:2023-10-28 14:00:48 27 4
gpt4 key购买 nike

以前,我确信你不能这样做,但前几天我正在玩一些代码,它似乎可以编译和工作。我只是想验证我不只是走运。模板类可以有一个纯虚函数吗?我猜这也意味着纯虚方法对析构函数也有效?

template <typename WordType> class DataSource
{
public:
DataSource();
DataSource(DataSource const& other);
virtual ~DataSource();

virtual void Put(
WordType const* const data,
unsigned int const wordCount) = 0;
}

我已经尝试在网上查找它,我所能找到的只是在普通类中不能有虚拟方法(纯或其他),例如:

class DataSource
{
public:
DataSource();
DataSource(DataSource const& other);
virtual ~DataSource();

template <typename WordType>
virtual void Put(
WordType const* const data,
unsigned int const wordCount) = 0;
}

这是由于无法管理虚拟表来引用此方法将要实例化的所有不同类型的可能类型。

但是,当涉及到模板类的虚成员函数时,它似乎有所不同,因为整个类本身是在模板类变量实例化时通过模板参数“创建”的。在这一点上,由于模板的“查找和替换”特性,虚拟方法就像类的任何其他虚拟方法一样。

无论如何,再次说明问题以防它在那里丢失:临时类中是否允许使用虚拟(纯和/或普通)虚函数?

最佳答案

类模板确实可以包含虚函数或纯虚函数。 Andrei Alexandresu 在“现代 C++ 设计”中采用了这一点,以使用模板和类型列表来实现访问者模式。可以看代码here in his Loki library如果你有兴趣。

对于大多数标准 C++ 实现,这很好,因为当模板被实例化时,虚函数最终成为一个单独的函数。因此,在翻译单元内可以知道 vtable 中所需的槽数,因此可以生成 vtable。

正如您所提到的,您不能拥有虚拟模板成员函数,因为在翻译单元中不知道 vtable 插槽的数量。

希望这会有所帮助!

关于c++ - 模板类中是否允许纯虚方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8919566/

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