类模板中的虚函数
Virtual function in class template
本文关键字:函数 更新时间:2023-10-16
我有一个名为Cache的模板类,它是字符串和对象的std::map的holder。
template<class T>
class Cache
{
public:
Cache() {}
virtual ~Cache();
virtual T* loadObject(const char *file);
virtual bool removeObject(const char *file);
virtual void removeAllObjects();
virtual unsigned int getNumObjects() const;
virtual T* getObject(const char *file);
protected:
typedef std::shared_ptr<T> t_ptr;
std::unordered_map<std::string, t_ptr> _objects; //file, shared ptr of object
};
template<class T>
T* Cache<T>::loadObject(const char *file)
{
//if object exists
T *obj = getObject(file);
if(obj)
return obj;
obj = new T();
if(obj)
return _objects.insert(std::make_pair(file,t_ptr(obj))).first->second.get();
else
return nullptr;
}
和一个继承自Cache的模板类称为ResourceCalled,它基本上是相同的类,但具有不同的loadObject()
方法。
template<class T>
class ResourceCache : public Cache<T>
{
public:
ResourceCache(ResourceLoader<T> *resourceLoader) : _resourceLoader(resourceLoader)
{}
virtual T* loadObject(const char *file);
private:
ResourceLoader<T> *_resourceLoader;
};
template<class T>
T* ResourceCache<T>::loadObject(const char *file)
{
//if object exists
T *obj = getObject(file);
if(obj)
return obj;
obj = _resourceLoader->load(file);
if(obj)
return _objects.insert(std::make_pair(file,t_ptr(obj))).first->second.get();
else
return nullptr;
}
在我的程序中,我初始化ResourceCache<>并将T设置为一个名为Mesh的类,该类在其构造函数中有一个参数。现在当我尝试编译程序时,编译器报错:
错误C2512: 'Mesh':没有合适的默认构造函数可用
这就像它试图为Cache而不是ResourceCache构建代码。但是,当我在Cache::loadObject()之前省略了virtual关键字时,程序将编译。
为什么会发生这种情况?我学会了在继承时总是使用virtual关键字。
在Cache<T>::loadObject()
中,有
obj = new T();
如果T
(在您的示例中是Mesh
)没有默认构造函数,则该行不起作用。
当Cache<T>::loadObject()
为virtual
时,函数的基类实现和派生类实现都被实例化。
当Cache<T>::loadObject()
不是virtual
时,只实例化该函数的派生类实现。函数的基类实现只有在显式使用时才会被实例化。
是的,它正在尝试构建缓存,因为这是你告诉编译器在某一点上要做的:
class ResourceCache : public Cache<T>
当T是实际类型时,编译器需要实例化Cache,其中包括方法Cache::loadObject,如果T没有默认构造函数,该方法将不编译。
你可以让基类的loadObject是纯虚拟的,然后从抽象类派生一个额外的类,实现你设置为默认的旧loadObject方法。
相关文章:
- "error: no matching function for call to"构造函数错误
- 什么时候调用组成单元对象的析构函数
- 继承函数的重载解析
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- C++模板来检查友元函数的存在
- 递归函数计算序列中的平方和(并输出过程)
- 对RValue对象调用的LValue ref限定成员函数
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 在C++STL中是否有Polyval(Matlab函数)等价物?
- 为什么使用 "this" 指针调用派生成员函数?
- 将对象数组的引用传递给函数
- 函数调用中参数的顺序重要吗
- 函数向量_指针有不同的原型,我可以构建一个吗
- 使用不带参数的函数访问结构元素
- 代码在main()中运行,但在函数中出现错误
- 内置函数可查看CPP中的成员变量
- 如何获取std::result_of函数的返回类型
- 如何在c++中为模板函数实例创建快捷方式
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗