Я думаю, что обёртывание класса было бы самым простым вариантом.Вместо прямого наследования от RefCounter создайте промежуточный класс.
struct RefCounterVirtPrivate_
{
int count;
RefCounterVirt()
: count( 0 )
{ }
};
struct RefCounter : public virtual RefCounterVirtPrivate_
{
};
struct A : public RefCounter { };
struct B : public RefCounter { };
struct C : public A, public B { };
Тогда все может наследоваться от RefCounter
без необходимости заботиться о виртуальном наследовании.Вам даже не нужно изменять какой-либо существующий код - виртуальное наследование самого RefCounter
должно быть безвредным.
Это, конечно, не гарантирует, что люди не наследуют от RefCounterVirtPrivate_
напрямую, но этоВот почему я дал ему очевидное имя.Труднее сделать это случайно, чем забыть ключевое слово virtual
.