【发布时间】:2011-01-09 18:41:06
【问题描述】:
有充分的理由将所有虚函数都构造为私有或受保护的基类接口(请参阅this)。但是,如何防止派生类(可能在外部客户手中)将私有虚函数设为公有?在Virtually Yours,作者讨论了这个问题,但没有讨论解决方案。
编辑:从您的回答和我之前的想法来看,似乎没有办法阻止这种情况。但是由于在这种情况下很容易出错(客户端肯定会触及受保护的虚函数),因此编译器会警告这种用法是有道理的。我尝试用 g++ 对其进行测试。首先,我写道:
class A {
protected:
virtual void none() { return; }
};
class B: public A {
public:
void none() { return; }
};
g++ -c -Wall -pedantic file.cpp 编译没有错误。添加-Weffc++ 给出警告:warning: ‘class A’ has virtual functions and accessible non-virtual destructor,这是有道理的。添加虚拟析构函数后,没有任何警告。因此,对于这种容易出错的情况,没有任何警告。
【问题讨论】:
-
什么可以阻止他们创建具有相同签名的公共方法只调用私有方法,从而暴露私有方法的功能?
-
显式暴露和无意暴露是有区别的。客户端在试图覆盖虚拟成员的时候碰到了受保护的成员,很容易出错。
标签: c++ virtual access-specifier overriding