作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
目标:
共享一个具有相同功能的基类,只有少数后代在实例化和释放 protected 或私有(private)指针时仅隐藏方法(getter 和 setter)。
问题:
仅当重新声明 setter 时,调用 getter 时出现此错误。
1>c:\projectengine\problem\main.cpp(8): error C2660: 'cDerived::SomeClass'
: function does not take 0 arguments
setter/getter 并不是真正需要的,但如果它已经存在,为什么还要公开功能。
结论:
cBase::SomeClass()
未被 cDerived
触及。
注释掉下一行时,没有编译错误(当然):
virtual void SomeClass( cSomeClass* value ) override {}; // setter, C2660
然而,这会起作用,因此不会改变任何东西,但会增加内存泄漏的风险。另一方面,这个偶然的衍生品应该继承 cBase
的其余功能,它本身就是一个后代。
我应该重写 cBase
还是只隐藏 cDerived
中的 setter?
错误代码:
主要.cpp
class cSomeClass
{
};
class cBase : public cAbsoluteBase
{
public:
cBase() : m_pSomeClass( 0 ){}
virtual cSomeClass* SomeClass(){ return m_pSomeClass; }
virtual void SomeClass( cSomeClass* value ){ m_pSomeClass = value; };
protected:
cSomeClass* m_pSomeClass;
};
class cDerived : public cBase
{
private:
// hide these
//virtual cSomeClass* SomeClass() override { return m_pSomeClass; };
virtual void SomeClass( cSomeClass* value ) override {};
};
cDerived derived;
int main()
{
cSomeClass* someClass = derived.SomeClass(); // C2660
return 0;
}
最佳答案
你需要一个 using声明。否则,派生类中的重载会隐藏基类中的函数。 (因为这通常是一个错误。如果您必须特化一个重载,通常您必须特化所有重载。)
关于c++ - 错误 C2660 : Hiding methods in a derived class,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11824591/
我是一名优秀的程序员,十分优秀!