错误C2660:隐藏派生类中的方法

时间:2012-08-06 08:06:32

标签: c++ compiler-errors derived

目标:

共享具有相同功能的基类,只有少数几个后代只是在实例化时隐藏方法(getter和setter)并释放受保护或私有指针。


问题:

当仅重新声明setter时,我在调用getter时会出现此错误。

1>c:\projectengine\problem\main.cpp(8): error C2660: 'cDerived::SomeClass'
    : function does not take 0 arguments

实际上并不需要吸气剂,但为什么要披露功能呢?


结论:

cBase::SomeClass()未受cDerived影响。

当注释掉下一行时,没有编译错误(当然):

virtual void        SomeClass( cSomeClass* value ) override {}; // setter, C2660

然而,这会起作用,因此不会改变任何东西,会增加内存泄漏的风险。另一方面,这种偶然的衍生物应该继承cBase的其余功能,后者本身就是后代。

我应该重写cBase还是只能隐藏cDerived中的设置者?


包含错误的代码:

的main.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; 

} 

2 个答案:

答案 0 :(得分:2)

您需要using声明。否则,派生类中的重载会隐藏基类中的函数。 (因为通常这是一个错误。如果你必须专门化一个重载,通常你必须专门化所有这些。)

答案 1 :(得分:0)

我不确定我是否可以准确地遵循您的描述,但是从代码片段看,您似乎希望从类中公开继承,但删除基类接口的其中一个方法。

这是可能的,甚至可能偶然发生,但这是一个非常糟糕的主意。公共继承是一种“是一种”关系。如果您的班级B公开继承自班级A,那么声明该关系意味着“类型B的对象可能比A类型的对象更大,但是除此之外,您可以在B所需的任何地方使用A。“显然B可能有其他行为,但公共继承承诺它们可以充当功能{{1} }秒。 (顺便说一句,这被称为“Liskov替代原则”。)

请注意,这也是为什么继承的早期教科书示例之一被彻底打破的原因:A继承自Square。是的,正方形是一个矩形,但这并不意味着让Rectangle公开继承自Square是合理的OO设计。因为子类对其父类具有额外限制会破坏许多其他完全有效且有用的代码,因为它们不遵守已建立的接口契约。 (在正方形的情况下,它们违反了合同条款,你应该能够彼此独立地改变矩形的边。在你的情况下,你似乎完全删除了界面的一部分。)