c++隨記三(黑馬程序員學習筆記)(多態,文件操作)

32、多態分爲靜態和動態兩種。靜態多態有函數重載、運算符重載;動態多態是派生類和虛函數實現運行時多態。靜態多態的函數地址早綁定,編譯階段確定函數地址,動態多態的函數地址晚綁定,運行階段確定函數地址。動態多態滿足條件:(1)有繼承關係;(2)子類重寫父類的虛函數。動態多態使用:父類的指針或者引用來指向子類的對象。

重寫是指函數返回值類型,函數名,參數列表完全一致。

33、當子類重寫了父類的虛函數,那麼子類中的虛函數表內部會替換成子類的虛函數地址。

34、純虛函數語法:virtual 返回值類型 函數名(參數列表)=0;當類中有了純虛函數,這個類也稱爲抽象類。抽象類無法實例化對象,子類必須重寫抽象類中的純虛函數,否則也屬於抽象類。

#include<iostream>
#include<string>
using namespace std;

class Base
{
public:
	//純虛函數,Base爲抽象類
	virtual void func() = 0;
};

class Son:public Base
{
public:
	virtual void func()
	{
		cout << "func函數調用" << endl;
	}
};

void test01()
{
	Base* base = new Son;
	base->func();
}
int main()
{
	test01();
	system("pause");
	return 0;
}

35、多態案例:製作飲品

#include<iostream>
#include<string>
using namespace std;
class AbstractDrinking
{
public:
	//煮水
	virtual void Boil() = 0;
	//沖泡
	virtual void Brew() = 0;
	//倒入杯中
	virtual void PourInCup() = 0;
	//加入輔料
	virtual void PutSomeThing() = 0;
	//製作飲品
	void makeDrink()
	{
		Boil();
		Brew();
		PourInCup();
		PutSomeThing();
	}
};
//製作咖啡
class Coffee :public AbstractDrinking
{
	//煮水
	virtual void Boil()
	{
		cout << "煮水" << endl;
	}
	//沖泡
	virtual void Brew()
	{
		cout << "沖泡咖啡" << endl;
	}
	//倒入杯中
	virtual void PourInCup()
	{
		cout << "倒入杯中" << endl;
	}
	//加入輔料
	virtual void PutSomeThing()
	{
		cout << "加入糖和牛奶" << endl;
	}
};
//製作茶葉
class Tea :public AbstractDrinking
{
	//煮水
	virtual void Boil()
	{
		cout << "煮礦泉水" << endl;
	}
	//沖泡
	virtual void Brew()
	{
		cout << "沖泡茶葉" << endl;
	}
	//倒入杯中
	virtual void PourInCup()
	{
		cout << "倒入杯中" << endl;
	}
	//加入輔料
	virtual void PutSomeThing()
	{
		cout << "加入枸杞" << endl;
	}
};
//製作函數
void doWork(AbstractDrinking* abs)//AbstractDrinking *abs = new Coffee
{
	abs->makeDrink();
	delete abs;//釋放
}
void test01()
{
	doWork(new Coffee);
	cout << "__________________" << endl;
	doWork(new Tea);
}
int main()
{
	test01();
	system("pause");
	return 0;
}

36、多態使用時,如果子類有屬性開闢到堆區,那麼父類指針在釋放時無法釋放子類的析構代碼,因此將父類中的析構函數改爲虛析構和純虛析構。有了純虛析構後,這個類也屬於抽象類。

37、C++中對於文件操作需要包含頭文件<fstream>。文件類型分爲文本文件和二進制文件。ofstream寫操作,ifstream讀操作,fstream讀寫操作。

#include<iostream>
using namespace std;
#include<fstream>
#include<string>

void test01()
{
	//寫文件
	//1、包含頭文件fstream
	//2、創建流對象
	ofstream ofs;
	//3、指定打開方式
	ofs.open("test.txt", ios::out);
	//4、寫內容
	ofs << "姓名:張三" << endl;
	ofs << "年齡:18" << endl;
	//5、關閉文件
	ofs.close();

	//讀文件
	ifstream ifs;
	ifs.open("test.txt", ios::in);
	if (!ifs.is_open())
	{
		cout << "文件打開失敗" << endl;
		return;
	}
	//讀數據
	char buf[1024] = { 0 };
	//第一種讀取方式
	while (ifs >> buf)
	{
		cout << buf << endl;
	}
	//第二種讀取方式
	while (ifs.getline(buf, sizeof(buf)))
	{
		cout << buf << endl;
	}
	//第三種讀取方式
	string buf;
	while (getline(ifs, buf))
	{
		cout << buf << endl;
	}
	ifs.close();
	//第四種讀取方式
	char c;
	while ((c = ifs.get()) != EOF)
	{
		cout << c;
	}
}
int main()
{
	test01();
	system("pause");
	return 0;
}

38、對二進制文件打開方式要指定爲ios::binary。

#include<iostream>
using namespace std;
#include<fstream>

class Person
{
public:
	char m_Name[64];
	int m_Age;
};
void test01()
{
	//寫二進制文件
	ofstream ofs;
	ofs.open("person.txt", ios::out | ios::binary);
	Person p = { "張三",18 };
	//const char *是強轉
	ofs.write((const char*)&p, sizeof(Person));
	ofs.close();

	//讀二進制文件
	ifstream ifs;
	ifs.open("person.txt", ios::in | ios::binary);
	if (!(ifs.is_open()))
	{
		cout << "文件打開失敗" << endl;
		return;
	}
	Person p2;
	ifs.read((char*)&p2, sizeof(Person));
	cout << "姓名" << p2.m_Name << "年齡" << p.m_Age << endl;
	ifs.close();
}
int main()
{
	test01();
	system("pause");
	return 0;
}

 

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