C++学习——day5 继承变量重名、函数重名、继承权限问题、继承中构造和析构、虚函数

继承中变量重名、函数重名

#include
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 不可见(不能访问)

受影响的是通过派生类访问时的权限(在类外)

继承中的构造和析构函数

一个子类对象被创建,父类构造->子类构造->子类析构->父类析构。
如果父类中自定义了有参构造函数,就没有默认无参构造函数,需要在子类初始化列表中指定父类的有参构造函数。组合的情况也一样,要手动调用有参构造函数来初始化。

父类指针指向子类对象

可以,但是不能访问子类的成员。
意义:提供统一接口、提高复用性

虚函数解决父类指针指向子类对象不能访问子类的成员的问题——多态

你可能感兴趣的:(C++基础)