Имеется следующая иерархия:
struct a
{
a(int x)
void f(int x)
{
if(x>0) g(x);
else h(x);
}
protected:
virtual void g(int x) {}
virtual void h(int x) {}
};
struct b : a
{
b(int x) : a(x) {}
protected:
virtual void g(int x) { do_something }
virtual void h(int x) { do_something }
}
Мне нужно проверить что функции g, h вызываются.
Можно сделать просто наследование:
struct с : b
{
c(int x) : a(x) {}
protected:
virtual void g(int x) { b::g(x) }
virtual void h(int x) { b::h(x) }
}
Но понадобилось для двух иерархий.
Поэтому решил сделать шаблон:
template<typename T>
struct add_check
{
protected:
virtual void g(int x) { T::g(x) }
virtual void h(int x) { T::h(x) }
}
Однако такое не сработает, если в классе b не будут определены оба метода.
Т.е.:
struct b2 : a
{
b2(int x) : a(x) {}
protected:
virtual void h(int x) { do_something }
};
struct b2_check : b2 , add_check<b2>
{
b2_check(int x) : b2(x) {}
};
// Error: Cannot access protected method b::g
Все это нужно для теста.
Подскажите как сделать.
Спасибо.