我遇到了一段代码,其中方法通过公共接口公开,而实现是私有的。我不确定预期的行为应该是什么。简化示例:
#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上有多个这样的问题)但反过来。
答案 0 :(得分:1)
C ++标准草案
访问虚拟功能[class.access.virt]
1虚拟功能的访问规则(第11条)由其声明确定,不受影响 以后覆盖它的函数的规则。
2使用表达式的类型在调用点检查访问,该表达式用于表示调用成员函数的对象(上例中为B *)。成员函数在定义它的类中的访问(上例中的D)通常是未知的。
该函数通过类型Interface
的指针调用,其中成员函数是公共的,因此允许访问。派生成员函数的访问是未知的,并且没有任何效果。就标准而言,行为是正确的并且定义明确。
当然,将覆盖函数定义为私有可能毫无意义,因为无论如何它都可以通过虚拟调度访问。