如何调用纯虚拟函数,而无需明确的名称
How can a pure-virtual function be invoked without its name being explicitly qualified?
您会在C 11中的[basic.def.odr]/2
中找到以下文本:
如果虚拟成员函数不纯化,则使用ODR函数。 a 非载荷功能的名称显示为潜在评估 Expression 或一组候选功能的成员,如果由 从潜在评估中提及的超负荷分辨率 表达式,是用ODR使用的,除非它是纯虚拟函数,否则 名称不明确。
根据上述突出显示的文本,可以将纯虚拟函数作为潜在评估的表达式调用,而不会明确地将其名称提出。迈克尔·伯尔(Michael Burr)的这个答案似乎显示出唯一的方法,可以调用纯虚拟功能,并且必须使用合格的名称。
ps:对于那些想知道为什么我仍然将问题转介给C 11标准的人,请在此处查看我的先前问题。
如何调用纯虚拟功能,而无需明确的名称?
那是普通的情况。从评论中借用Yakk的示例:
struct Foo {
virtual void bar() = 0;
};
void quux(Foo* f) {
f->bar();
}
在这里,纯虚拟函数Foo::bar
被调用而没有明确的资格。因此,根据引用的段落,Foo::bar
是不是 odr-使用的,因此不需要定义它。取而代之的是,其在派生类中的非纯效力是ODR使用的,它们是需要定义的函数。
但是,如果您明确符合纯虚拟函数的呼叫,则使其成为ODR使用,并且需要定义。这最常见的是纯虚拟破坏者,因为派生的类驱动器总是会唤起基类击路剂,好像它们是完全合格的。这就是为什么需要定义纯虚拟破坏者的原因。
相关文章:
- 构造函数正在调用一个使用当前类类型的函数
- 函数何时会在c++中包含stack_Unwind_Resume调用
- 如何在主函数中调用模板类
- 向量推回调用析构函数时调用析构函数
- 是否可以使用函数指针调用虚拟析构函数?
- 将成员函数作为构造函数参数调用时出错 "Variable is not a type name"
- 没有匹配的成员函数来调用'push_back'错误
- 在模板化类的构造函数中调用构造函数
- 为什么从另一个构造函数内部调用C++构造函数不修改类变量?
- 如何通过python方法和kwargs来提升python的c++函数和调用
- 推迟析构函数的调用
- Tbb 库:错误:编写自定义类函数而不是 lambda 表达式时,对函数的调用不匹配
- 在模板化的 Rcpp 函数中调用另一个 cpp 函数
- 如何使派生类函数在调用时始终调用相同的基类函数?
- 在成员构造函数之后调用基类构造函数
- 为什么在传递给函数而不是构造函数时调用析构函数?
- 如何从不同的类中获取函数来调用在 Main 中声明的对象?
- 为什么我不能像这样在静态成员函数中调用静态成员变量?
- 从带有参数的基函数指针调用基方法
- localtime() 函数正在调用 ___lll_lock_wait_private(),这会使线程陷入死锁