I have an abstract class used by objects that want to use some fooization mechanism
#include <unordered_set>
class Fooable
{
public:
Fooable() { registered.insert(this); }
~Fooable() { registered.erase(this); }
virtual void fooify() = 0;
static void fooify_all()
{
for(auto * f : registered)
f->fooify();
}
private:
static std::unordered_set<Fooable*> registered;
};
std::unordered_set<Fooable*> Fooable::registered;
Then a base class (note the private inheritance):
class Fruit : private Fooable
{
void fooify() override final { //Access class private members }
};
And a derived class
class Apple : public Fruit, private Fooable
{
void fooify() override final { //Access class private members }
};
Both Apple
and Fruit
want to have their own private definition of fooify
, which uses the class private variables and do stuff. And at the end fooify
will be called for both class implementations, independently of each other.
The issue is, the compiler complains when Apple
tries to override a virtual function marked with final
. While those functions should be unrelated.
I could add levels of indirection, but this would make the code use lots of accessors or friend classes, as fooify does access a lot of private member variables.
Any idea to make this work or redesign it a nice way?
Example that fails to compile because of final
: https://onlinegdb.com/CbcHXryX2
Example without final
that compiles but shows Apple
overrides indirectly inherited Fruit::fooify
while I would like it to implement its directly inherited Fooable::fooify
: https://onlinegdb.com/xH-MNxpVW