Чтение этого ответа, я был достаточно удивлен, чтобы попробовать себя, если он действительно работает, как описано:
#include <iostream>
class A {
public:
virtual void foo() = 0;
};
class B {
public:
virtual void foo() = 0;
};
class C : public A, public B {
public:
virtual void foo();
};
void C::foo(){
std::cout << "C" << std::endl;
}
void C::A::foo(){
std::cout << "A" << std::endl;
}
void C::B::foo(){
std::cout << "B" << std::endl;
}
int main() {
C c;
static_cast<A*>(&c)->foo();
static_cast<B*>(&c)->foo();
c.foo();
return 0;
}
Я действительно не думал, что можно переопределить виртуальный метод из двух разных базовых классов, имеющих одно и то же имя и подпись. И, как я ожидал, над программами печатает:
C
C
C
Таким образом, ответ неправильный - как я чувствовал с самого начала. Удивительная часть: почему мой gcc принимает этот синтаксис: void C::A::foo(){
? Я не мог найти ничего, что это могло означать. Это ошибка/особенность gcc? Это какой-то неясный стандартный синтаксис С++? Или я полностью неверно истолковал ситуацию?
EDIT:
Кажется, что void C::A::foo(){}
- это просто определение для A::foo
в этом контексте. Но почему? Это ошибка GCC? Или это как-то разрешено стандартом? Если да, то это конкретное правило для такого рода вещей или какое-то общее предложение (скажем: если идентификатор не имеет смысла - например, "C:: A:: foo", тогда компилятор может делать то, что он хочет).