Если у меня есть Object *, который указывает на SoftBall, будет ли вызываться версия foo () SoftBall? Если нет, есть ли способ достичь этого эффекта? По существу, этот аспект полиморфизма все еще работает на более чем одном уровне наследования?
Да
C ++ определяет методы как виртуальные, если соответствующая перегрузка является виртуальной в базовом классе (в отличие от других языков OO, где переопределения должны быть помечены явно).
http://codepad.org/pL09QWNN
Обратите внимание, что с некоторыми другими ингредиентами вы можете стать действительно прикольными:
#include <iostream>
struct A { virtual void foo() { std::cout << "A::foo();" << std::endl; } };
struct B { virtual void foo() { std::cout << "B::foo();" << std::endl; } };
struct Oa: A, B { using A::foo; };
struct Ob: A, B { using B::foo; };
#define TEST(a) std::cout << #a << ":\t"; a
int main()
{
A a;
B b;
Oa oa;
Ob ob;
TEST(a.foo());
TEST(b.foo());
TEST(oa.foo());
TEST(ob.foo());
std::cout << "But oa through different references:" << std::endl;
{
A& ar = oa;
TEST(ar.foo());
B& br = oa;
TEST(br.foo());
}
std::cout << "And ob through different references:" << std::endl;
{
A& ar = ob;
TEST(ar.foo());
B& br = ob;
TEST(br.foo());
}
return 0;
}
Попробуйте предсказать, что будет напечатано здесь. Становится намного веселее, когда вы смешиваете:
- (изменяемые / постоянные / изменчивые) перегрузки
- (конфликтующие) аргументы по умолчанию
Я помню, что читал довольно много более и менее ужасных примеров в виде вопроса о пустяках, с которым, я надеюсь, никогда не столкнусь в интервью. Хотя я знаю, что отвечу: «Если у вас есть такой код, я не уверен, что хочу эту работу»?
Вы можете посмотреть на Херба Саттера, Скотта Мейера, и вы будете поражены тем, какие подводные камни скрываются в нашем "C ++ * 1028", так называемом "цивилизованном, милом, маленьком".