我正在开发一个c ++应用程序而且我遇到了一个问题: 我有一个派生自抽象类A的B类,它有一些事件处理方法。第三类C来自B,必须重新实现一些B方法。有没有办法在调用C的方法之前隐式调用B的方法?
类图:
class A
{
virtual void OnKeyPress(event e)=0;
};
class B : public A
{
virtual void OnKeyPress(event e)
{
print("Keypressed: "+e)
};
};
class C : public B
{
void OnKeyPress(event e)
{
//DoSomething
}
}
我想到的一个解决方法是使用C :: foo()中的B :: foo()从C调用父方法。这是有效的,但是由开发人员记住在方法的主体中添加调用。
另一种是定义一个新的虚方法,子方法将覆盖该方法,父方将在其“OnKeyPress”方法中调用。
谢谢你, 3mpty。
答案 0 :(得分:4)
您必须显式调用基类方法。
class C : public B
{
virtual void OnKeyPress(event e)
{
B::OnKeyPress(e);
// Do stuff
}
};
重新阅读你的问题.....
最好的办法是在B中实现最后调用C实现的附加受保护虚拟方法的方法。
即
class B : public A
{
protected:
virtual void AdditionalKeyStuff(event e) { }
public:
virtual void OnKeyPress(event e)
{
// Do B Stuff
// Finally give decendants a go.
AdditionalKeyStuff(e)
}
};
class C : public B
{
protected:
virtual void AdditionalKeyStuff(event e)
{
// Do only C stuff
}
};
如果你想强迫任何后代覆盖它,你可以将B中的AdditionalKeyStuff(...)设为纯虚拟。
答案 1 :(得分:1)
没有。没有办法进行这种隐含的调用。
另外,你在问题中提供了两种方法来做到这一点!
答案 2 :(得分:1)
“几乎”与问题相同,但分离公共类接口和继承接口 - 对所有类型的检测都非常有用:
class A
{
private:
virtual void DoOnKeyPress( event ) = 0;
void PreKeyPress( event ) { /* do something */ }
void PostKeyPress( event ) { /* do something */ }
public:
virtual ~A() {}
void OnKeyPress( event e )
{
PreKeyPress( e );
DoOnKeyPress( e );
PostKeyPress( e );
}
};
class B : public A
{
private:
virtual void DoOnKeyPress( event e )
{
std::cout << "Keypressed: " << e << std::endl;
}
};
答案 3 :(得分:0)
只有在有问题的方法是构造函数时才有可能,然后只有在构造对象时才会发生这种情况。如果你可以安排在构造函数中完成所有必要的工作,那么你可能会有一些东西,但是很难概括出这个解决方案。