Виртуальные базовые классы, используемые в виртуальном наследовании, являются способом предотвратить несколько "экземпляров" данного класса, появляющегося в иерархии наследования при использовании множественного наследования.
Рассматривают следующий сценарий:
class A { public: void Foo() {} };
class B : public A {};
class C : public A {};
class D : public B, public C {};
вышеупомянутая иерархия классов приводит к "страшному ромбу", который похож на это:
A
/ \
B C
\ /
D
экземпляр D будет составлен из B, который включает A и C, который также включает A. Таким образом, у Вас есть два "экземпляра" (из-за отсутствия лучшего выражения) A.
, Когда у Вас есть этот сценарий, у Вас есть возможность неоднозначности. Что происходит, когда Вы делаете это:
D d;
d.Foo(); // is this B's Foo() or C's Foo() ??
Виртуальное наследование там для решения этой проблемы. Когда Вы определяете виртуальный при наследовании классов, Вы говорите компилятору, что только хотите единственный экземпляр.
class A { public: void Foo() {} };
class B : public virtual A {};
class C : public virtual A {};
class D : public B, public C {};
Это означает, что существует только один "экземпляр" включенного в иерархию. Следовательно
D d;
d.Foo(); // no longer ambiguous
Hope, которая помогает как мини-сводка. Для получения дополнительной информации имейте чтение это и это . Хороший пример также доступен здесь .
вы можете попробовать testopia для bugzilla http://www.mozilla.org/projects/testopia/ это довольно красиво и бесплатно / с открытым исходным кодом.
TestLink - еще один очень хороший вариант; я настоятельно рекомендую его.