فرض کن یک کلاس Base داری :
class Base
{
void foo();
};
بعد از این کلاس ۲ تا کلاس رو مشق کردی :
class child1 : public Base
{
};
class child2 : public Base
{
}
الان هر ۲ تا کلاس child1 , child2 تابع foo رو داخل خودشون دارن
حالا اگر یک کلاس دیگه رو بخوایم از این ۲ تا مشتق کنیم یعنی :
class child3 : public child1,public child2
{
};
اگر بخوایم از متد foo استفاده کنیم کامپایلر ارور میده چون نیمدونه از foo داخل child1 باید استفاده کنه یا child2 و خطای ambigous میده
که اصطلاحا به این مشکل diamond problem میگن .
برای جل این مشکل بصورت Virtual کلاس های child1 , child2 رو مشتق می کنیم :
#include <iostream>
class Base
{
public:
void foo(){}
};
class child1 : public virtual Base
{};
class child2 : public virtual Base
{};
class child3 : public child1,public child2
{};
int main()
{
child3 c;
c.foo();\\ok
}