lio*_*ori 26 c++ overriding virtual-functions private access-specifier
我刚刚在一些代码中发现了这个:
class Foo {
[...]
private:
virtual void Bar() = 0;
[...]
}
Run Code Online (Sandbox Code Playgroud)
这有什么用途吗?
(我试图将一些代码从VS移植到G ++,这引起了我的注意)
Gre*_*ers 22
请参阅Herb Sutter的文章,了解为什么要做这样的事情.
RC.*_*RC. 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);
};
ISO C++ 2003明确允许它:
§10.3没有说明访问说明符,并且在第二个子句中包含一个脚注,在虚函数覆盖的上下文中说明:
[...]在确定覆盖时不考虑访问控制(第11条).
代码完全合法.
我将从精彩的C++ FAQ Lite中引用一个简短的解释,它总结得很好:
[23.4]有人应该何时使用私人虚拟机?
几乎从不.
受保护的虚拟机是可以的,但私有虚拟机通常是净损失.原因:私有虚拟混淆了新的C++程序员,混淆会增加成本,延迟计划并降低风险.
新的C++程序员对私有虚拟机感到困惑,因为他们认为私有虚拟无法被覆盖.毕竟,派生类无法访问其基类中的私有成员,因此,他们会问,它是否可以覆盖其基类中的私有虚拟?上面有解释,但那是学术性的.真正的问题是,几乎每个人在第一次遇到私人虚拟时都会感到困惑,而且混乱也很糟糕.
除非有相反的令人信服的理由,否则请避免私人虚拟.
在此期间,C++ FAQ Lite得到了更新:
顺便说一句,它使大多数新手C++程序员感到困惑,私有虚拟可以被覆盖,更不用说有效了.我们都被告知基类中的私有成员在从它派生的类中是不可访问的,这是正确的.但是,派生类的这种不可访问性与虚拟调用机制没有任何关系,虚拟调用机制与派生类有关.由于这可能会使新手感到困惑,因此以前建议使用C++ FAQ来使用受保护的虚拟而不是私有虚拟.然而,私有虚拟方法现在足够普遍,新手的混淆不再是一个问题.