目标:
共享具有相同功能的基类,只有少数几个后代只是在实例化时隐藏方法(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;
}
答案 0 :(得分:2)
您需要using声明。否则,派生类中的重载会隐藏基类中的函数。 (因为通常这是一个错误。如果你必须专门化一个重载,通常你必须专门化所有这些。)
答案 1 :(得分:0)
我不确定我是否可以准确地遵循您的描述,但是从代码片段看,您似乎希望从类中公开继承,但删除基类接口的其中一个方法。
这是可能的,甚至可能偶然发生,但这是一个非常糟糕的主意。公共继承是一种“是一种”关系。如果您的班级B
公开继承自班级A
,那么声明该关系意味着“类型B
的对象可能比A
类型的对象更大,但是除此之外,您可以在B
所需的任何地方使用A
。“显然B
可能有其他行为,但公共继承承诺它们可以充当功能{{1} }秒。 (顺便说一句,这被称为“Liskov替代原则”。)
请注意,这也是为什么继承的早期教科书示例之一被彻底打破的原因:A
继承自Square
。是的,正方形是一个矩形,但这并不意味着让Rectangle
公开继承自Square
是合理的OO设计。因为子类对其父类具有额外限制会破坏许多其他完全有效且有用的代码,因为它们不遵守已建立的接口契约。 (在正方形的情况下,它们违反了合同条款,你应该能够彼此独立地改变矩形的边。在你的情况下,你似乎完全删除了界面的一部分。)