公共接口方法的私有实现

Private implementation for public interface method

本文关键字:实现 方法 接口      更新时间:2023-10-16

我遇到了一段代码,其中的方法通过公共接口公开,而实现是私有的。我不确定预期的行为应该是什么。简化示例:

#include <iostream>
class Interface
{
public:
    virtual ~Interface() {}
    virtual void myIfMethod() = 0;
};
class Derived : public Interface
{
private:
    void myIfMethod(){std::cout << "private method invoked via public interface" << std::endl;}
};
int main()
{
    Interface* myObj = new Derived;
    myObj->myIfMethod();
    delete myObj;
    return 0;
}

此示例编译和执行时不显示警告:http://ideone.com/1Ouwk4

这是一种正确且定义明确的行为吗?如果是这样,为什么?

请注意,问题不在于公共实现的私有接口方法(SO 上有多个此类问题),而是相反

C++标准草稿

访问虚拟函数 [class.access.virt]

1 虚拟函数的访问规则(第 11 条)由其声明决定,不受 稍后覆盖它的函数的规则。

2 在调用

点使用用于表示调用成员函数的对象(在上面示例中为 B*)的表达式类型检查访问。成员函数在定义它的类(上面示例中的 D)中的访问通常是未知的。

该函数通过 Interface 类型的指针调用,其中成员函数是公共的,因此允许访问。派生成员函数的访问是未知的,并且没有影响。就标准而言,行为是正确的,并且定义明确。

当然,定义覆盖函数私有可能毫无意义,因为它无论如何都可以通过虚拟调度访问。