Personally I have yet to find a real-world practical example of a deep hierarchy that felt like an intuitive, natural approach to solving the given problem. I'm not specifically skeptical of their existence, but I do question if maybe the problem with deep hierarchies is addressed by not using them.
Oh I quite agree that in general having a deep inheritance hierarchy is not ideal and that many problems can better be solved with compartmentalization or other approaches. I was asking more in the context of you have a million+ line code base and want to make things less error prone/cleaner without refactoring large chunks of it.
Though this is not the only solution, a visitor pattern seems to match.
I can think of other possibilities; hopefully this sparks some good ideas for you. I'll sketch up how I think the visitor pattern could work, sorry if it's already obvious:
Base class A. Derived classes B, C, and D.
When A::Foo() is called run code from each class, in the order they are initialized.
class A {
protected:
vector<function<void(int)>> visitFoo;
public:
void Foo(int bar) {
for (auto fn : visitFoo) {
fn(bar);
}
}
};
class B : public A {
protected:
// Do not override Foo in class B, C, or D.
void FooB(int bar) {
}
public:
B() {
// visitor pattern
visitFoo.emplace_back(FooB);
}
};
In D, I just call super.this(var, var) to ensure I'm calling the correct base constructor. And fire off an assert if super(void) gets called because I didn't explicitly write a specialized one.
But I think C++ has what... parameter lists for that?