В следующем примере:О множественного наследования и неоднозначности
class A {
public:
virtual void f() { cout << "a" << endl; }
virtual void h() { cout << "A" << endl; }
};
class s1 : public A {
public:
virtual void f() { cout << "s1" << endl; }
};
class s2 : public A {
public:
virtual void h() { cout << "s2" << endl; }
};
class GS : public s1, public s2 {
public:
};
int main()
{
s1 *q = new GS;
q->h();//no problem
GS a;
a.h();//error
}
Почему a.h();
дают ошибку неоднозначности еще q->h();
нет?
Не имеет *q
экземпляр GS
, который должен вызывать такую же проблему двусмысленности?
С виртуальным наследованием 'GS' всегда будет искать ближайший базовый класс с функцией, которая ему нужна? Здесь 'a.h();' перейдет к 's2 :: h()' перед 'A :: h()'? – shinzou
Это нормальное правило виртуального интерфейса. Реализация производного класса переопределяет интерфейс базового класса, если интерфейс виртуальный. – jxh