私はC + +のクイズを行っています。そして、次のコードを見つけました。違法ですが、理由を理解できません。なぜこの行が説明できますか:継承 - なぜこれは違法ですか?
Box* b1 = s1->duplicate();
は、「Shape *からBoxに変換できません」というコンパイラエラーを生成しますか? s1->duplicate()
は、s1
が実際にBox
を指しているので、Box::duplicate()
を呼び出していると思っていましたが、コンパイラエラーからは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;
}
[Tのため彼の](http://stackoverflow.com/questions/4665117/c-virtual-function-return-type)。 –