次の問題を理解してください。以下のコード例でauto_ptrを<Base>からauto_ptrにキャスト<Derived>
ルック:
#include <iostream>
class Shape {
public:
virtual wchar_t *GetName() { return L"Shape"; }
};
class Circle: public Shape {
public:
wchar_t *GetName() { return L"Circle"; }
double GetRadius() { return 100.; }
};
int wmain() {
using namespace std;
auto_ptr<Shape> aS;
auto_ptr<Circle> aC(new Circle);
aS = aC;
wcout << aS->GetName() << L'\t' << static_cast<auto_ptr<Circle>>(aS)->GetRadius() << endl;
return 0;
}
私はこれを行うことは許されないのです理由:
static_cast<auto_ptr<Circle>>(aS)->GetRadius()
コンパイラ(MSVCPP 11):
1>c:\program files (x86)\microsoft visual studio 11.0\vc\include\xmemory(911): error C2440: 'initializing' : cannot convert from 'Shape *' to 'Circle *'
1> Cast from base to derived requires dynamic_cast or static_cast
@Truncheon:故意_trolling_ていますか?数ヶ月後、私はこのような気がしませんでした。あなたのコメントは、「私がコメントを落とすことができれば嬉しい」という別のケースです。 – sbi
あまりにもあなたがコメントを下げることはできません。私は、メモリ管理がポインタをラップするオブジェクトによって処理できる場合でも、std :: auto_ptrsが常に最良の代替手段であるとは限りません。開発者は、ポインタなどをぶら下げることを考える代わりに、彼が解決している実際の問題に焦点を当てるかもしれません。 –
@sbi私たちは似ていると思う。(私はこのスレッドをリフレッシュしなかったので、私はあなたのコメントを見たことがなかった) –