Рассмотрим небольшого примера:неожиданного поведения с использованием декларации с частным наследованием в C++
#include <iostream>
struct A
{
void foo()
{
std::cout << "A::foo" << std::endl;
}
};
struct B
{
void foo()
{
std::cout << "B::foo" << std::endl;
}
};
struct C:private A
{
using A::foo;
};
struct D:private B, public C
{
};
int main()
{
D myD;
myD.foo();
return 0;
}
При составлении этого примера с г ++ 4.8.1, я получаю эти ошибки:
prog.cpp: In function ‘int main()’:
prog.cpp:32:9: error: request for member ‘foo’ is ambiguous
myD.foo();
^
prog.cpp:5:10: note: candidates are: void A::foo()
void foo()
^
prog.cpp:5:10: note: void A::foo()
prog.cpp:13:10: note: void B::foo()
void foo()
Я бы подумал, что поиск D :: foo() проигнорировал B :: foo(), потому что B частным образом унаследован от D, и в D. нет объявления using
. Я бы подумал, что единственным видимым foo() будет A: : Foo().
Но ясно, что я ошибся, и я неправильно понял аспект декларации using
.
Может кто-нибудь объяснить:
Почему B :: Foo() виден здесь
Как сделать компилятор видеть только :: Foo() без изменения общественных интерфейсов A , B или C?