C++學習——day5 繼承變量重名、函數重名、繼承權限問題、繼承中構造和析構、虛函數

繼承中變量重名、函數重名

#include<iostream>
using namespace std;
class CFather
{
public:
	int aa;
	void Fun1()
	{
		cout << "father fun1" << endl;
	}
	void Fun2()
	{
		cout << "father fun2" << endl;
	}
};
class CSon:public CFather
{
public:
	int aa;//子類中優先調用子類中的變量和函數 父類重名被隱藏
	void Fun1(int a)
	{
		cout << "son fun1" << endl;
	}
	void Fun2()
	{
		cout << "son fun2" << endl;
	}
	void GetFatheraa()
	{
		cout << CFather::aa << endl;//加作用域後能訪問到父類aa
	}
protected:
private:
};
int main()
{
	CFather f;
	CSon s;
	f.aa = 10;
	s.aa = 10;//訪問到的是子類變量
	s.CFather::aa = 100;

	cout << f.aa << endl;
	cout << s.aa << endl;
	cout << s.CFather::aa << endl;

	//s.Fun1();報錯 繼承中出現函數重名不能觸發重載
	s.CFather::Fun1();//需要加作用域後調用父類函數

	s.Fun1(1);
	s.Fun2();//默認調用子類中的函數
	s.CFather::Fun2();//需要加作用域後調用父類函數

	return 0;
}

繼承的訪問權限修飾符

我們看到,繼承的時候需要在子類類名後加冒號、訪問修飾符、父類類名,不同的訪問權限修飾符,繼承後對父類中成員的訪問權限是不一樣的。

基類(父類) public protected private
公有繼承 public protected 不可見(不能訪問)
保護繼承 protected protected 不可見(不能訪問)
私有繼承 private private 不可見(不能訪問)

受影響的是通過派生類訪問時的權限(在類外)

繼承中的構造和析構函數

一個子類對象被創建,父類構造->子類構造->子類析構->父類析構。
如果父類中自定義了有參構造函數,就沒有默認無參構造函數,需要在子類初始化列表中指定父類的有參構造函數。組合的情況也一樣,要手動調用有參構造函數來初始化。

父類指針指向子類對象

可以,但是不能訪問子類的成員。
意義:提供統一接口、提高複用性

虛函數解決父類指針指向子類對象不能訪問子類的成員的問題——多態

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