gpt4 book ai didi

c++ - 错误 C2660 : Hiding methods in a derived class

转载 作者:太空狗 更新时间:2023-10-29 21:48:02 25 4
gpt4 key购买 nike

目标:

共享一个具有相同功能的基类,只有少数后代在实例化和释放 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com