#include <iostream>
#include <thread>
#include <memory> //智能指針所在頭文件
using namespace std;
class BaseClass
{
public:
BaseClass(){}
~BaseClass(){}
virtual void print()
{
cout << "this is base class" << endl;
}
protected:
string _name;
int _key;
};
class DerivedClass :public BaseClass
{
public:
DerivedClass() {}
~DerivedClass(){}
void print()
{
cout << "this is derived class" << endl;
}
};
int main()
{
BaseClass *base = new DerivedClass(); //基類指針可以指向派生類對象
base->print(); //這裏調用print函數是直接調用的派生類的print函數,如果print函數沒有加virtual關鍵字,則會調用基類的print函數
//DerivedClass *derived = new BaseClass();//這裏報錯,派生類指針不能指向基類對象
DerivedClass *de = dynamic_cast<DerivedClass*>(base); //把基類指針所指的對象轉換爲具體的派生類對象,要能實現這個多態的轉換,基類必須要有函數添加關鍵字virtual
de->print();
//智能指針
cout << "shared pointer" << endl;
shared_ptr<BaseClass> shared_base = make_shared<DerivedClass>();
shared_base->print();
//智能指針基類強轉爲派生類
shared_ptr<DerivedClass> shared_de = dynamic_pointer_cast<DerivedClass>(shared_base);
shared_de->print();
//由普通指針構造智能指針
shared_ptr<BaseClass>shared_ba(base);//base 是上面用過的指向派生類的普通指針類型,通過構造函數直接構造智能指針
shared_ba->print();
//由智能指針構造普通指針
BaseClass *common_base;
common_base = shared_ba.get();
common_base->print();
system("pause");
return 0;
}