1.动态类型转换
#include <iostream>
#include <string.h>
#include <unistd.h>
using namespace std;
class Human {
private:
int a;
public:
virtual void eating(void) { cout<<"use hand to eat"<<endl; }
virtual ~Human() { cout<<"~Human()"<<endl; }
virtual Human* test(void) {cout<<"Human's test"<<endl; return this; }
};
class Englishman : public Human {
public:
void eating(void) { cout<<"use knife to eat"<<endl; }
virtual ~Englishman() { cout<<"~Englishman()"<<endl; }
virtual Englishman* test(void) {cout<<"Englishman's test"<<endl; return this; }
};
class Chinese : public Human {
public:
void eating(void) { cout<<"use chopsticks to eat"<<endl; }
virtual ~Chinese() { cout<<"~Chinese()"<<endl; }
virtual Chinese* test(void) {cout<<"Chinese's test"<<endl; return this; }
};
void test_eating(Human& h)
{
Englishman *pe;
Chinese *pc;
h.eating();
if (pe = dynamic_cast<Englishman *>(&h))
cout<<"This human is Englishman"<<endl;
if (pc = dynamic_cast<Chinese *>(&h))
cout<<"This human is Chinese"<<endl;
}
int main(int argc, char **argv)
{
Human h;
Englishman e;
Chinese c;
test_eating(h);
test_eating(e);
test_eating(c);
return 0;
}
类有虚函数,它的对象里面就含有一个指针, 指向一个表,表含有类信息,从类信息里面知道这个对象是属于哪个类的、继承信息。。。。。
动态类型转换就是根据类信息来找的,其只能用在含有虚函数的类里面
2.能动态转化成父类吗?能
#include <iostream>
#include <string.h>
#include <unistd.h>
using namespace std;
class Human {
private:
int a;
public:
virtual void eating(void) { cout<<"use hand to eat"<<endl; }
virtual ~Human() { cout<<"~Human()"<<endl; }
virtual Human* test(void) {cout<<"Human's test"<<endl; return this; }
};
class Englishman : public Human {
public:
void eating(void) { cout<<"use knife to eat"<<endl; }
virtual ~Englishman() { cout<<"~Englishman()"<<endl; }
virtual Englishman* test(void) {cout<<"Englishman's test"<<endl; return this; }
};
class Chinese : public Human {
public:
void eating(void) { cout<<"use chopsticks to eat"<<endl; }
virtual ~Chinese() { cout<<"~Chinese()"<<endl; }
virtual Chinese* test(void) {cout<<"Chinese's test"<<endl; return this; }
};
class Guangximan : public Chinese {
public:
void eating(void) { cout<<"use chopsticks to eat, I come from guangxi"<<endl; }
};
void test_eating(Human& h)
{
Englishman *pe;
Chinese *pc;
Guangximan *pg;
h.eating();
if (pe = dynamic_cast<Englishman *>(&h))
cout<<"This human is Englishman"<<endl;
if (pc = dynamic_cast<Chinese *>(&h))
cout<<"This human is Chinese"<<endl;
if (pg = dynamic_cast<Guangximan *>(&h))
cout<<"This human is Guangximan"<<endl;
}
int main(int argc, char **argv)
{
Guangximan g;
test_eating(g);
return 0;
}
use chopsticks to eat, I come from guangxi
This human is Chinese
This human is Guangximan
~Chinese()
~Human()
3.
该运算符把 expression 转换成 type-id 类型的对象
type-id 必须是类的指针、类的引用或者 void* ;
如果 type-id是指针,expression必须也是指针
如果 type-id是引用,expression必须也是引用
前面是指针,下面改为引用
#include <iostream>
#include <string.h>
#include <unistd.h>
using namespace std;
class Human {
private:
int a;
public:
virtual void eating(void) { cout<<"use hand to eat"<<endl; }
virtual ~Human() { cout<<"~Human()"<<endl; }
virtual Human* test(void) {cout<<"Human's test"<<endl; return this; }
};
class Englishman : public Human {
public:
void eating(void) { cout<<"use knife to eat"<<endl; }
virtual ~Englishman() { cout<<"~Englishman()"<<endl; }
virtual Englishman* test(void) {cout<<"Englishman's test"<<endl; return this; }
};
class Chinese : public Human {
public:
void eating(void) { cout<<"use chopsticks to eat"<<endl; }
virtual ~Chinese() { cout<<"~Chinese()"<<endl; }
virtual Chinese* test(void) {cout<<"Chinese's test"<<endl; return this; }
};
class Guangximan : public Chinese {
public:
void eating(void) { cout<<"use chopsticks to eat, I come from guangxi"<<endl; }
};
void test_eating(Human& h)
{
#if 1
//Englishman& pe = dynamic_cast<Englishman&>(h); err 广西转化为英国人
//用指针的时候可以不成功,所以强制类型转换经常用指针
Chinese& pc = dynamic_cast<Chinese&>(h);
Guangximan& pg = dynamic_cast<Guangximan&>(h);
#else
Englishman& pe = reinterpret_cast<Englishman&>(h);
Chinese& pc = reinterpret_cast<Chinese&>(h);
Guangximan& pg = reinterpret_cast<Guangximan&>(h);
#endif
h.eating();
}
int main(int argc, char **argv)
{
//Human h;
//Englishman e;
//Chinese c;
Guangximan g;
//test_eating(h);
//test_eating(e);
//test_eating(c);
test_eating(g);
return 0;
}
上行:派生类对象转化为基类对象
下行:基类对象转化为派生类对象
为什么称为动态类型转换? 因为传入的 Human& h 不确定
4.静态类型转换
#include <iostream>
#include <string.h>
#include <unistd.h>
using namespace std;
class Human {
private:
int a;
public:
virtual void eating(void) { cout<<"use hand to eat"<<endl; }
virtual ~Human() { cout<<"~Human()"<<endl; }
virtual Human* test(void) {cout<<"Human's test"<<endl; return this; }
};
class Englishman : public Human {
public:
void eating(void) { cout<<"use knife to eat"<<endl; }
virtual ~Englishman() { cout<<"~Englishman()"<<endl; }
virtual Englishman* test(void) {cout<<"Englishman's test"<<endl; return this; }
};
class Chinese : public Human {
public:
void eating(void) { cout<<"use chopsticks to eat"<<endl; }
virtual ~Chinese() { cout<<"~Chinese()"<<endl; }
virtual Chinese* test(void) {cout<<"Chinese's test"<<endl; return this; }
};
class Guangximan : public Chinese {
public:
void eating(void) { cout<<"use chopsticks to eat, I come from guangxi"<<endl; }
};
void test_eating(Human& h)
{
#if 1
//Englishman& pe = dynamic_cast<Englishman&>(h);
Chinese& pc = dynamic_cast<Chinese&>(h);
Guangximan& pg = dynamic_cast<Guangximan&>(h);
#else
Englishman& pe = reinterpret_cast<Englishman&>(h);
Chinese& pc = reinterpret_cast<Chinese&>(h);
Guangximan& pg = reinterpret_cast<Guangximan&>(h);
#endif
h.eating();
}
int main(int argc, char **argv)
{
Human h;
//Englishman e;
//Chinese c;
Guangximan g;
Englishman *pe;
pe = static_cast<Englishman *>(&h);
//Englishman *pe2 = static_cast<Englishman *>(&g); //err
Chinese *pc = static_cast<Chinese *>(&g);
return 0;
}