(10)C++智能指針---shared_ptr,dynamic_pointer_cast

#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;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章