Re: How to detect overwritten virtual method in base class?
macracan wrote:
....
Is there any way I can write it?
How about this:
// override check helper class
struct OverriddenCheck
{
friend class WindowSink;
friend void Subscribe(WindowSink &sink);
bool m_checking;
OverriddenCheck() : m_checking() {}
private:
enum OverrideState { Overridden, Default };
public:
void IsOverridden()
{
if ( m_checking ) throw Overridden;
}
private:
void IsDefault()
{
if ( m_checking ) throw Default;
}
}
struct WindowSink
{
OverriddenCheck m_check;
// ...
// default empty handlers
virtual void Move(int x, int y)
{
IsDefault();
}
virtual void Draw()
{
IsDefault();
}
private:
void IsDefault() // can only be called by methods in WindowSink
{
m_check.IsDefault();
}
};
//...
struct MyWindowSink : public WindowSink
{
// overwrite Draw only
void Draw()
{
m_check.IsOverridden();
}
};
void Subscribe(WindowSink &sink)
{
static WindowSink sinkref; // some reference to compare with
long mask = 0;
sink.m_check.m_checking = true;
try {
sink.Move(0,0);
// improperly implemented sink
abort();
} catch ( OverriddenCheck::OverrideState l_override )
if ( l_override == Overridden ) mask |= 1;
}
try {
sink.Draw();
// improperly implemented sink
abort();
} catch ( OverriddenCheck::OverrideState l_override )
if ( l_override == Overridden ) mask |= 2;
}
// there is probably some kind of template you can use to
// eliminate most of the try-catch blocks and write somthing like:
CheckOverride( sink, &WindowSink::Draw, mask, 1 );
CheckOverride( sink, &WindowSink::Move, mask, 2 );
sink.m_check.m_checking = false;
// subscribe to messages based on mask
XSelectInput(/* some other params */, mask);
}
int main()
{
MyWindodwSink sink;
//...
Enable(sink);
// ...
return 0;
}