公共接口方法

时间:2016-01-19 11:25:41

标签: c++ interface

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

#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上有多个这样的问题)但反过来

1 个答案:

答案 0 :(得分:1)

C ++标准草案

访问虚拟功能[class.access.virt]

  

1虚拟功能的访问规则(第11条)由其声明确定,不受影响   以后覆盖它的函数的规则。

     

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

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

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