1.指引或者引用的向上转换,向下转换
例如基类A ,派生类B.。A->B 则为向下转换。。B->A则为向上转换。向上转换为隐士转换。向下转换需要dynamic_cast或者c的转换方式。
B * b = new B;
A * a = b;
此时b就是向上转换。无需显式转换既可以编译通过。
2.dynamic_cast
一般用于有继承关系的类之间的向下转换。
3.dynamic_pointer_cast
当指针是智能指针时候,向下转换,用dynamic_Cast 则编译不能通过,此时需要使用dynamic_pointer_cast。
dynamic_pointer_cast用于shared_ptr之间类型的转换,基类需要有虚函数
//编译错误
#include <memory>
#include <iostream>
class base{
public:
base(){std::cout << "base" << std::endl;}
~base(){std::cout << "~base" << std::endl;}
void print(){std::cout << "base::print" << std::endl;}
};
class derived:public base{
public:
derived(){std::cout << "derived" << std::endl;}
~derived(){std::cout << "~derived" << std::endl;}
void print(){std::cout << "derived::print" << std::endl;}
};
int main()
{
std::shared_ptr<base> b_ptr = std::make_shared<derived>();
b_ptr->print();
auto d_ptr = std::dynamic_pointer_cast<derived>(b_ptr);
d_ptr->print();
return 0;
}
//正常运行
#include <memory>
#include <iostream>
class base{
public:
base(){std::cout << "base" << std::endl;}
virtual ~base(){std::cout << "~base" << std::endl;}
void print(){std::cout << "base::print" << std::endl;}
};
class derived:public base{
public:
derived(){std::cout << "derived" << std::endl;}
~derived(){std::cout << "~derived" << std::endl;}
void print(){std::cout << "derived::print" << std::endl;}
};
int main()
{
std::shared_ptr<base> b_ptr = std::make_shared<derived>();
b_ptr->print();
auto d_ptr = std::dynamic_pointer_cast<derived>(b_ptr);
d_ptr->print();
return 0;
}
-