그래, Base
이 다형성이 아니지만 내 문제가 이것에 관한 것이 아니라면, dynamic_cast
을 사용한 다운 캐스트는 컴파일 할 수 없다는 것을 알고 있습니다.Base에서 Derived의`dynamic_cast`
class Base {
public:
virtual void bar()
{
cout << "bar\n";
}
};
class Derived: public Base {
public:
void foo()
{
cout << "foo\n";
}
};
int main()
{
Base *pb;
Derived *pd;
pb = new Derived; //Base* points to a Derived object
pd = dynamic_cast<Derived*>(pb);
pd->foo(); //outputs foo
pb = new Base; //Base* points to a Base object
pd = dynamic_cast<Derived*>(pb);
pd->foo(); //outputs foo, too. Why?
}
나는 pb = new Derived;
이 pb
실제로 Derived
객체를 가리키는 경우 힙에있다 생각했다. pd = dynamic_cast<Derived*>(pb);
이후에 pd
도 Derived
개체를 가리키고 있으므로 pd->foo()
은 정상이어야합니다.
그러나, pd = dynamic_cast<Derived*>(pb);
후 다음 힙에서 Base
객체에 어떤 pb
점 pb = new Base;
을 때, 어떻게 pd->foo()
작품 수 있을까? dynamic_cast
을 개체를 Derived
개체로 전환 했습니까?
'pd-> foo();'라고하면'foo()'는'pd'가'NULL'이든 상관없이 호출됩니다. – Alcott
@Alcott yes. 그러나 'this' 매개 변수는 NULL로 전달됩니다 (즉,'pd'의 값). 따라서 Rohan의 예에서'a'에 액세스하여 역 참조 해제 할 때 예상되는 충돌이 발생합니다. – littleadv
이것은 주로 컴파일러에 의존적이며 @Luchian Grigore가 언급했듯이 모든 일이 발생할 수 있습니다. 그래서, 대부분의 경우, 그렇습니다. 그러나 그것은 당신이 의지 할 수없는 것입니다. –