模板包含虚函数是否安全?
Is it safe if a template contains virtual function?
先绑定模板,后绑定虚函数。因此,如果模板包含虚函数是否安全?
template<typename T>
class base {
public:
T data;
virtual void fn(T t){}
};
完全安全。一旦实例化了类模板,它就像其他类一样变成了普通类。
template<typename T>
class base {
public:
T data;
virtual void fn(T t){}
};
class derived : base<int> {
public:
virtual void fn(int t){} //override
};
base<int> *pBase = new derived();
pBase->fn(10); //calls derived::fn()
我还想指出,虽然允许在类模板中使用虚函数,但不允许在类模板中使用虚函数(如下所示):
class A
{
template<typename T>
virtual void f(); //error: virtual function template is not allowed
};
是的,它很安全。您可以通过从它派生一个类来使用它:
class derived : public base<int> {
virtual void fn(int) { std::cout << "derived"; }
};
当然,如果它包含任何其他虚函数(即,打算用作基类),则通常也希望使doctor为虚函数。
在template
类中没有与virtual
函数相关的安全问题。这相当于在一个正常的class
里面有一个virtual
函数
相关文章:
- 通过网络、跨平台传递std::变体是否安全
- 在类型和包装器之间reinterpret_cast是否安全<Type>?
- 跨 DLL 边界访问虚拟方法是否安全/可能?
- 静态 constexpr 类成员变量对多线程读取是否安全?
- 在函数结束后使用指向变量的指针是否安全?
- 逐字节删除 void* 是否安全?
- 在 RAII 构造中修改 RVO 值是否安全?
- 线程调用的函数对对象删除是否安全?
- 将对象的字节复制到数组并再次复制回来是否安全
- std::memmove在同一对象之间是否始终安全
- 使用枚举为数组编制索引是否安全?
- 返回从字符串文本创建的静态string_view是否安全?
- 在cstlib中将#include_next替换为#include是否安全
- 由并发无序映射查找线程调用的函数是否安全?
- 使用 c++ 原子时编写"y=++x"是否安全?
- 从另一个线程发出信号是否安全?
- 从其存储的回调中删除 std::函数是否安全
- 使用 std::vector::swap 方法在C++中交换两个不同的向量是否安全?
- 当我在C++中调用 struce 的只读静态成员时,线程是否安全
- 同时调用 ASIO 对象的 API 是否安全?