Mao*_*Mao 3 c++ lookup language-lawyer c++11
请考虑以下代码段:
#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();
}
Run Code Online (Sandbox Code Playgroud)
它打印S::pure2
.
看看C++ 11标准,我不确切知道这是怎么发生的.我认为这与§3.4.5/ 4有关:
如果类成员访问中的id-expression是表单的qualified-id
类名称或名称空间名称:: ...
下面的class-name-or-namespace-name.或 - >运算符首先在对象表达式的类中查找,如果找到,则使用名称.否则,它将在整个postfix-expression的上下文中查找 .
但我不明白如何使用上面的表达式pure2()
在基类中找到纯虚函数.S
t.S::pure2();
可以在基类中实现纯虚函数.该标准规定有效(强调我的):
10.4抽象类
2抽象类是一个只能用作其他类的基类的类; 除了作为派生自它的类的子对象之外,不能创建抽象类的任何对象.如果一个类至少有一个纯虚函数,则它是抽象的.[注意:这样的功能可能会被继承:见下文.-end note]通过在类定义中的函数声明中使用pure-specifier(9.2)来指定虚函数.只有在使用(12.4)qualified-id语法(5.1)调用时,才需要定义纯虚函数.
如果你没有打电话
t.S::pure2();
Run Code Online (Sandbox Code Playgroud)
那么,可以省略实现S::pure2()
.如果你没有实现S::pure2()
但仍然被调用,那将是一个链接时间错误
t.S::pure2();
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
136 次 |
最近记录: |