Я рискну заявить об очевидном: вы вызываете функцию, если она определена в базовом классе, она автоматически доступна в производном классе (если только она не private
).
Если в производном классе есть функция с такой же сигнатурой, вы можете устранить неоднозначность, добавив имя базового класса, за которым следуют две двоеточия base_class::foo(...)
. Следует отметить, что в отличие от Java и C #, в C ++ нет есть ключевое слово для "базового класса" (super
или base
), поскольку C ++ поддерживает множественное наследование , которое может привести к до неоднозначности.
class left {
public:
void foo();
};
class right {
public:
void foo();
};
class bottom : public left, public right {
public:
void foo()
{
//base::foo();// ambiguous
left::foo();
right::foo();
// and when foo() is not called for 'this':
bottom b;
b.left::foo(); // calls b.foo() from 'left'
b.right::foo(); // call b.foo() from 'right'
}
};
Между прочим, вы не можете напрямую наследовать один и тот же класс дважды, так как не будет никакого способа сослаться на один из базовых классов над другим.
class bottom : public left, public left { // Illegal
};