注意:基类指针不可以转化为派生类指针!!!
通常人的做法都是直接强制转化,那样实际上是不安全的。可以先看一下这个博客的讲解,然后再看我下面的代码
http://blog.sina.com.cn/s/blog_4eaff3e10101jope.html
#include<iostream>
#include<ctime>
#include<string>
using namespace std;
class C1
{
public:
C1(int h) :hold(h) {}
virtual void Speak()const
{
cout << "这是C1类" << endl;
}
virtual int Value() const
{
return hold;
}
private:
int hold;
};
class C2 :public C1
{
public:
C2(int h) :C1(h) {}
void Speak()const
{
cout << "这是C2类" << endl;
}
virtual void Say()const
{
cout << "C2类中hold的值为" << Value() << endl;
}
};
class C3 :public C2
{
public :
C3(int h, char c) :C2(h), ch(c) {}
void Speak()const
{
cout << "这是C3类" << endl;
}
void Say()const
{
cout << "C3类中hold的值为" << Value() <<" ch 等于 "<<ch<< endl;
}
private:
char ch;
};
C1 *Get();
int main()
{
srand((unsigned)time(NULL));
C1 *c1;
C2 *c2;
for (int i = 0; i < 5; i++)
{
c1 = Get();
c1->Speak();
if (c2 = dynamic_cast<C2*>(c1))//安全的转化指针,如果转化不成功,则为NULL
c2->Say();
}
system("pause");
return 0;
}
C1 *Get()
{
C1 *p;
switch (rand() % 3)
{
case 0:
p = new C1(rand() % 100);
break;
case 1:
p = new C2(rand() % 100);
break;
case 2:
p = new C3(rand() % 100,'A'+rand()%26);
break;
}
return p;
}