如何使C++基类的public方法不可被重写?
解决方法:阻止子类隐藏基类的非虚public方法
首先明确:你的代码里,基类的foo不是虚函数,子类der里的foo属于隐藏基类同名方法,而非重写(重写仅针对虚函数)。要阻止子类定义同名的foo,可以用以下两种方式:
方法1:使用C++11的final修饰基类的foo
给基类的foo函数加上final关键字,这样任何子类都无法定义同名成员函数,编译器会直接报错。修改后的基类代码如下:
class base { public: virtual void bar() = 0; void foo() final // 加上final修饰 { //Do some calculations this->bar(); } };
此时如果子类der尝试定义foo,编译器会抛出类似"virtual function 'void der::foo()' overriding final function"的错误(不同编译器提示略有差异)。
方法2:利用访问控制实现(适配旧C++标准)
如果你的编译器不支持C++11,可以把基类的foo实现放在私有继承的辅助类中,通过访问控制阻止子类定义同名方法,示例如下:
class BaseFoo { protected: void foo() { //Do some calculations static_cast<base*>(this)->bar(); } }; class base : private BaseFoo { public: using BaseFoo::foo; // 将foo暴露为public接口 virtual void bar() = 0; }; class der : public base { public: virtual void bar() {std::cout<<"Bar\n";} // 尝试定义foo会触发编译错误,因为子类无法访问base的私有基类BaseFoo // void foo() {} // 编译报错 };
这种方式代码复杂度较高,优先推荐方法1。
补充说明:如果你的核心需求是确保基类foo的逻辑被强制执行、不被子类篡改,final是最直接的语法层面解决方案,彻底避免了子类隐藏基类方法的可能。
内容的提问来源于stack exchange,提问作者The Winner
相关产品推荐
相关产品推荐

