1
22
见 this Herb Sutter article 至于你为什么要做这种事。 |
2
10
这是一个纯虚拟函数,恰好是私有的。这使得派生类必须实现该方法。在这种情况下,巴。 我认为您可能会混淆B/C,这是为了在C++中创建“接口”,很多时候人们认为这些接口是公共的。在某些情况下,您可能希望定义一个私有接口,其中公共方法使用这些私有方法以确保调用它们的顺序。(我认为这叫做模板方法) 举个相对糟糕的例子:) class RecordFile { public: RecordFile(const std::string &filename); void process(const Record &rec) { // Call the derived class function to filter out // records the derived instance of this class does // not care about if (filterRecord(rec)) { writeRecordToFile(rec); } }; private: // Returns true if the record is of importance // and should be kept virtual bool filterRecord(const Record &rec) = 0; void writeRecordToFile(const Record &rec); }; |
3
9
ISO C++ 2003明确允许: _§10.3未说明访问说明符,甚至在第二条中包含脚注,在虚拟函数重写的上下文中说明:
该准则完全合法。 |
4
5
通常的“学术”答案是:访问说明符和虚拟是正交的——一个不影响另一个。 更实际的答案是:私有虚拟函数通常用于实现 Template Method 设计模式。在不支持私有虚拟函数的语言中,模板方法需要是公共的,尽管实际上并不打算成为接口的一部分。 |
5
5
我要引用伟大的 C++ FAQ Lite 总而言之:
同时对C++ FAQ Lite进行了更新:
|
6
2
它是一个纯虚拟函数。任何脱离“foo”的最终实现都必须实现“bar”功能。 |
7
1
它使函数成为纯虚拟的,而不是虚拟的。 默认情况下不提供任何实现,其目的是必须由继承类指定函数实现。但是,这可以被忽略。 有时您会看到完整的类,其中所有成员函数都以这种方式指定为纯虚拟的。 这些是抽象的基类,有时被称为接口类,ABC的设计者对您说,“我现在已经知道如何为这个基类的所有特殊化实现这个功能。但是,你必须为你的专业工作定义所有这些,你知道你的对象应该如何表现”。 编辑: 哎呀,刚刚发现成员纯虚拟函数是私有的。(谢谢迈克尔)这稍微改变了一点。 当使用私有继承继承这个基类时,它会改变事情。基本上,基类的设计者所做的就是说,当派生类调用基类中的非私有函数时。部分行为已委托给派生类中的函数专业化。非私有成员正在执行“something”,“something”的一部分是通过纯虚拟基类函数调用您的实现。 因此,foo中的一些公共函数调用foo中的bar函数,它依赖于这样一个事实,即您将为您的特定情况提供bar函数的专门实现。 Scott Meyers将此称为“根据实施”。 顺便说一句,只是轻声笑了笑,因为有人很快就删除了答案,但他们也没有看到问题中的“细版”!(-) 高温高压 干杯, |
8
0
它的唯一目的似乎是提供一个公共接口。 btw即使函数声明为私有虚拟,它仍然可以用类实例或从朋友那里实现和调用。 尽管如此,这类东西通常是用来作为接口的,但我不这么做。 |