Я только что пробовал этот фрагмент кода:
struct FaceOfPast
{
virtual void Smile() = 0;
};
struct FaceOfFuture
{
virtual void Smile() = 0;
};
struct Janus : public FaceOfPast, public FaceOfFuture
{
virtual void Smile() {printf(":) ");}
};
...
void main()
{
Janus* j = new Janus();
FaceOfFuture* future = j;
FaceOfPast* past = j;
future->Smile();
past->Smile();
delete j;
}
Он работает по назначению (выводит два смайлика), но я не думаю, что он должен даже компилироваться, а переопределение Smile()
в Janus
неоднозначно.
Как (и почему) это работает?