标准如何支持在基类S中调用纯虚拟函数
How does the Standard support this call of a pure virtual function in the base class S?
考虑这个片段:
#include <iostream>
struct S {
virtual void pure1() = 0;
virtual void pure2() = 0;
};
struct T : S {
void pure1() { std::cout << "T::pure1" << 'n'; }
void pure2() { std::cout << "T::pure2" << 'n'; }
};
void S::pure2() { std::cout << "S::pure2" << 'n';}
int main()
{
T t;
t.S::pure2();
}
它打印S::pure2
。
看看C++11标准,我不知道这到底是怎么发生的。我认为这与§3.4.5/4:有关
如果类成员访问中的id表达式是的限定id表单
类名或命名空间名称::。。。
后面的类名或命名空间名称。or->运算符首先在对象表达式和名称的类中查找,如果已找到,正在使用。否则,它将在整个后缀表达式。
但我不明白纯虚拟函数pure2()
是如何在具有上述表达式t.S::pure2();
的基类S
中找到的。
在基类中实现纯虚拟函数是可以的。标准规定有效(强调矿):
10.4抽象类
2抽象类是一个只能用作其他类的基类的类;除了作为派生自抽象类的子对象之外,不能创建抽象类的任何对象。如果类至少有一个纯虚拟函数,则该类是抽象的。[注意:这样的函数可能是继承的:请参阅下文。--结束注释]通过在类定义中的函数声明中使用纯说明符(9.2),可以将虚拟函数指定为纯函数只有当使用限定id语法(5.1)调用或像使用(12.4)一样调用时,才需要定义纯虚拟函数。
如果你没有打电话给
t.S::pure2();
则可以省略S::pure2()
的实现。如果你没有实现S::pure2()
,但仍然调用,这将是一个链接时间错误
t.S::pure2();
您引用的位涵盖了表达式t.S::pure2()
中S
的查找。它根本不适用于名称pure2
。
此处的相关裁决为10.3/15:
作用域运算符(5.1)的明确限定抑制了虚拟调用机制。示例:
class B { public: virtual void f(); }; class D : public B { public: void f(); }; void D::f() { /* ... */ B::f(); }
这里,
D::f
中的函数调用确实调用了B::f
,而不是D::f
-结束示例]
相关文章:
- 如何用参数值调用函数(仅在运行时已知)
- 从python中调用C++函数并获取返回值
- 当使用通配符和null指针调用函数时,对输出的说明
- 从R调用C++函数并对其进行集成时出错
- 使用QTreeView,如何通过调用函数只突出显示特定的行/列
- 如何在qt中从另一个类调用函数
- 在 COUT 语句中使用 COUT 调用函数
- 如何从线程中的不同模块调用函数?
- C++从函数指针数组调用函数
- 当 A 在 for 循环中调用函数 B 时,如何计算函数 A 的空间复杂度?
- 如何在 C/C++ 中从外部库调用函数
- 如何使用运算符在同一行中多次调用函数
- 是否可以创建一个从不同类调用函数的线程?
- 无法为类成员调用函数
- 如何从另一个标头 c++ 调用函数
- C++有什么方法可以在既不调用函数模板也不提供其模板参数的情况下引用函数模板?
- 如何只允许在调用函数 B 后调用函数 A?
- 我可以这样调用函数吗?
- 如何在 c++ 的类中递归调用函数方法?
- 为什么在指向对象的迭代器上调用函数不允许我更改对象本身?