c++ - 为什么在接口(interface)中定义私有(private)成员/方法?

标签 c++ oop

我一直对大多数 OOP 语言(或者更确切地说,C++)让你在接口(interface)中定义私有(private)方法/成员这一事实感到困惑(我所说的接口(interface)是指类声明 - 似乎我很困惑)。这不是展示了类的实现细节,违背了封装的思想吗?

我错过了这个有充分的理由吗?

最佳答案

对于 C++,这是一个实现问题。

C++ 编译器必须能够通过只查看类声明而不是实现来生成使用类的代码。编译器需要的一件非常重要的事情是类实例的大小,因为除其他外,C++ 通过嵌入而不是通过存储对单独对象的引用来处理对象中的子对象。为了能够构建一个对象(例如 struct X { Y y; Z z; })所有子对象的大小(例如 YZ) 必须提前知道。

解决此问题的方法是使用 the "pimpl" pattern (also named the "compiler firewall" pattern)这使您可以对类(class)的用户隐藏所有内部细节。不幸的是,这会带来一些运行时的额外成本,但大多数时候它是微不足道的。使用这种方法,公共(public)对象将始终具有指针的大小,并且将使用额外的间接访问实例中的所有数据......优点是您可以添加私有(private)数据成员,并且该类的用户不需要被重新编译(如果你的类在一个 DLL 中,这允许保持二进制兼容性)。

能够在实现部分仅声明私有(private)方法(无数据)是可能的,而不会增加编译器的复杂性,但 C++ 设计者认为最好为一个类保留一个声明。

实际上,即使只是添加一个私有(private)方法也可能会影响许多实现中类实例的大小(例如,如果私有(private)方法是类中唯一的虚拟方法)。

关于c++ - 为什么在接口(interface)中定义私有(private)成员/方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7344054/

相关文章:

C++无法创建类的实例

php - 混淆何时在 php 中从子类实例化父类

c - 在 C 中不使用对象进行管理 - 而且,为什么我可以在 C 中的函数中的任何位置声明变量?

PHP 面向对象 : mysql_connect not returning false when wrong information passed

c++ - 如何使用 2 个字符形成 ASCII(十六进制)数字?

c++ - Visual Studio 2012 中的智能感知 : No members available for Inner classes in class template?

c++ - 构造函数没有被调用?

c++ - 在哪里可以找到具有多个源文件 (> 15) 的中型开源 C(也包括 C++)程序

javascript - PHP:通过点表示法访问嵌套对象属性

java - 如何处理 Java 中一维数组的跳过输入