公共接口方法的私有实现
Private implementation for public interface method
我遇到了一段代码,其中的方法通过公共接口公开,而实现是私有的。我不确定预期的行为应该是什么。简化示例:
#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
类型的指针调用,其中成员函数是公共的,因此允许访问。派生成员函数的访问是未知的,并且没有影响。就标准而言,行为是正确的,并且定义明确。
当然,定义覆盖函数私有可能毫无意义,因为它无论如何都可以通过虚拟调度访问。
相关文章:
- 实现无开销push_back的最佳方法是什么
- 用常见虚拟函数实现的任意组合来实现派生类的正确方法是什么
- 这是实现图形的坏方法吗
- 在 c++ 中实现嵌套循环的更短方法吗?
- 如何实现 Front() 方法以返回模板化双向链表C++的第一个元素?
- 如何在从抽象基派生的类中实现相同的方法?
- C++数组队列实现方法错误
- 有没有一种通用的方法来实现不变量
- 'using namespace'实现细节的便捷方法(仅标头库)?
- 使用非递归插入方法实现 AVL 树
- C ++类型特征:确保子类实现方法
- 实现基于数字值(正、负、零)的条件表达式的最佳方法
- 在C++上实现高斯赛德尔迭代方法
- C++方法实现:是否可以避免每次都键入类名?
- 如何知道C2259 VS 2017错误未实现哪种方法?
- C++强制在子类中实现方法,但具有不同的签名
- 避免在每个派生类中重新实现方法调用
- C :执行模板类型实现方法
- 在C++中实现方法时继承不起作用
- 还有更好的实现方法吗?