Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
关于界面类的google风格指南问题 我是C++初学者,我读谷歌风格指南。 它建议以下关于接口类的内容 它只有公共纯virtual(“=0”)方法 它可能没有非静态数据成员_C++ - Fatal编程技术网

关于界面类的google风格指南问题 我是C++初学者,我读谷歌风格指南。 它建议以下关于接口类的内容 它只有公共纯virtual(“=0”)方法 它可能没有非静态数据成员

关于界面类的google风格指南问题 我是C++初学者,我读谷歌风格指南。 它建议以下关于接口类的内容 它只有公共纯virtual(“=0”)方法 它可能没有非静态数据成员,c++,C++,我想知道为什么会这样 (a) 接口类不应具有默认函数和 (b) 非静态数据成员?关于问题(b),是否与 类的初始化还是序列化 这是一个更为琐碎和私人的问题 (c) 如果我亲自将“mix-in”类称为“protocol”类,您认为有什么问题吗?我试着用一个标记名来命名我在类中的混合,比如“ClassInterface”中的“Interface”,这是google style guide建议的。“mix-in”虽然我想表达我对这个名字的敬意,但对我来说,这门课并不直观。“协议”对我来说很直观,

我想知道为什么会这样

  • (a) 接口类不应具有默认函数和
  • (b) 非静态数据成员?关于问题(b),是否与 类的初始化还是序列化
这是一个更为琐碎和私人的问题

  • (c) 如果我亲自将“
    mix-in
    ”类称为“
    protocol
    ”类,您认为有什么问题吗?我试着用一个标记名来命名我在类中的混合,比如“
    ClassInterface
    ”中的“
    Interface
    ”,这是google style guide建议的。“
    mix-in
    ”虽然我想表达我对这个名字的敬意,但对我来说,这门课并不直观。“
    协议
    ”对我来说很直观,因为它是一种玩家共享的过程
如果有人知道原因或有任何意见。请让我知道他们。
非常感谢。

我不知道你说没有默认功能是什么意思。没有数据成员基本上是为了避免具有多个接口的类的各种冲突,特别是接口和真正的基类

例如,假设类X实现了InterfaceA,它有成员m_foo。如果InterfaceB也有成员m_foo,并且X决定从InterfaceB继承并实现该接口,则X的现有实现可能会被破坏,因为在X中提及m_foo将是不明确的。见:

我可能还应该补充一点:没有成员变量是接口不提供任何实现的逻辑结果。因为它们不做任何工作或运行任何代码,所以接口类没有理由需要非静态成员变量

编辑:好的,那么默认函数,我想你的意思是,为什么样式指南说函数不能有实现,必须是纯虚拟的

<>这又归结为C++中的多重继承的困难情况。如果接口类方法具有实现,则可以继承它们而无需重新实现。如果您有两个具有相同方法名的接口,并且您继承了这两个接口,那么将调用哪个函数?这与成员变量的问题相同

基本上,这都回到了C++中多重继承的问题。接口规则模仿java中的实际语言结构,它没有完全的多重继承。有了这些限制,您可以避免这些棘手的情况,但也会丢失C++完全多继承的部分权力。p>
参见:

谢谢Nir,这是对问题(b)的非常好的回答。“没有默认功能”是指“默认实现”。谷歌风格指南建议接口类只有公共纯虚拟(“=0”)。所以它不应该有任何实现。但我不知道为什么这是必要的。再次感谢你,再次感谢你。我想不出多个继承中函数的冲突。你给我的推荐信也很好。