标准如何支持在基类S中调用纯虚函数?

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()在基类中找到纯虚函数.St.S::pure2();

R S*_*ahu 5

可以在基类中实现纯虚函数.该标准规定有效(强调我的):

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)