Przechodzę do quizu C++. I natknąłem się na następujący kod - jest nielegalny, ale nie mogę zrozumieć, dlaczego. Czy ktoś może wyjaśnić, dlaczego ta linia:Dziedziczenie - dlaczego jest to nielegalne?
Box* b1 = s1->duplicate();
generuje błąd kompilatora, „nie można przekonwertować z Shape * do skrzynki”? Założono, że s1->duplicate()
dzwoni Box::duplicate()
ponieważ s1
faktycznie wskazuje na faktycznie wskazuje na Box
- ale z powodu błędu kompilatora wygląda na to, że wywołuje Shape::duplicate()
.
#include <iostream>
struct Shape
{
virtual Shape* duplicate()
{
return new Shape;
}
virtual ~Shape() {}
};
struct Box : public Shape
{
virtual Box* duplicate()
{
return new Box;
}
};
int main(int argc, char** argv)
{
Shape* s1 = new Box;
Box* b1 = s1->duplicate();
delete s1;
delete b1;
return 0;
}
powodu [t jego] (http://stackoverflow.com/questions/4665117/c-virtual-function-return-type). –