【发布时间】:2016-01-19 11:25:41
【问题描述】:
我遇到了一段代码,其方法通过公共接口公开,而实现是私有的。我不确定预期的行为应该是什么。简化示例:
#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 有多个此类问题),而是反过来。
【问题讨论】:
-
没有错。这是毫无意义的,客户端代码总是可以转换为接口类型并进行调用。类没有义务使接口方法起作用,它可以抛出“未实现”异常。然后,您最好将其声明为私有以降低暴露风险。
-
对此也有很多疑问。访问保护是编译时检查,你使用的是
Interface的接口,函数是公共的。