그래서 나는 prata의 C++ 입문서를 마무리하고 있습니다. RTTI를 사용하고 있습니다. 그는 다운 캐스팅 라인을 보여 주었고 잘못되었다고 말했지만 더 좋은 예를보고 싶습니다.포인터 다운 캐스트/상속에 대해서
class Grand
{
private:
int hold;
public:
Grand(int h=0) : hold(h) {}
virtual void Speak() const { cout << "I am a grand class\n";}
virtual int Value() const {return hold; }
void Gah() const {cout << "ok" << endl;}
};
class Superb : public Grand
{
public:
Superb(int h = 0) : Grand(h){}
void Speak() const {cout << "I am a superb class!!\n";}
virtual void Say() const
{ cout << "I hold the superb value of " << Value() << "!\n";}
void Sah() const { cout << "Noak" << endl;}
};
class Magnificent : public Superb
{
private:
char ch;
public:
int hour;
Magnificent(int h = 0, char c = 'A') : Superb (h), ch(c){}
void Speak() const {cout << "I am a magnificent class!!!\n";}
void Say() const {cout << "I hold the character " << ch <<
"and the integer " << Value() << "!\n";}
void Mah() const {cout << "Ok" << endl;}
};
Grand * GetOne();
int _tmain(int argc, _TCHAR* argv[])
{
/*
srand(time(0));
Grand * pg;
Superb * ps;
*/
Grand * pg = new Grand;
Grand * ps = new Superb;
Grand * pm = new Magnificent;
Magnificent * ps2 = (Magnificent *)pg;
ps2->Gah();
cout << ps2->hour << endl;
system("pause");
}
위와 같이 전체적으로 완료되지 않은 파생물에 기초를 캐스팅합니다. 그러나이 예제에서는 무엇이 실제로 제한되어 있습니까? 내가 Pg를 캐스팅 할 때, 나는 여전히 ps2를 통해 모든 웅장한/웅장한/훌륭한 속성과 메소드에 액세스 할 수 있습니다. 즉, 여기서 아무것도 실패하지 않습니다. 누구든지 나에게 예제를 주거나 코드에 무언가를 추가하여 파생 된 부분에 기반을 할당하는 것이 어떻게 엉망이되는지 명확히 보여 줄 수 있습니까?
좋아, 지금은 이해하지만 위의 예제는 파생 된 것 대신 기본 인쇄를 실행했습니다 ... 비록 가상 기능이지만 ... – Ilya
예, 게시 후 알게되었습니다. 'base'가 첫 번째 기본 클래스가 아닌 다중 상속 예제를 업데이트했습니다. –