Suppose I have two base classes B1 and B2, and a class D that derives from both B1 and B2 as follows:
class B1 {
public:
// ...
virtual void foo() final { cout << "Hello, B1\n"; }
};
class B2 {
public:
// ...
virtual void foo() { cout << "Good riddance, B2!\n"; }
};
class D :public B1, public B2 {
// ...
};
In designing the class D, I want to override the member function called foo() from B2; however, foo() in B1 is marked final and prevents me from overriding foo() in B2. What is the best approach to override foo() from B2?
I don't think what you want to do is possible in the manner you've shown in the question. From N3337, §10.3/2 [class.virtual]
D::foomatches all those criteria forB1::fooandB2::foo, hence it overrides both. And sinceB1::fooisfinal, the code is ill-formed.One workaround is to introduce an extra level of inheritance. Define a class, say
D2, that derives fromB2and overridesB2::foo. ThenDcan derive fromB1andD2instead.Live demo