C++ 继承与多态的基本用法

目录

1.继承

1.1访问等级

1.2函数遮蔽

2.多态

2.1虚函数


1.继承

有父类,有子类,这种层次关系就叫继承,也就说说子类能从父类哪里继承很多东西,继承这种概念或性质是面向对象程序设计的核心思想之一。

这种继承需要先定义一个父类,父类中主要是定义一些公共的成员变量成员函数,然后通过继承这个父类来构建新的类,这个新的类就叫做子类通过继承父类中有很多成员变量和成员函数就自动继承到了子类中,那么在书写子类的时候就减少了很多代码工作量——只用写子类独有的一些内容即可。

我们先定义一个父类里面包含一个成员变量和成员函数代码如下:

class base
{
public:
	void base_fun()
	{
		cout << "base" << endl;
	}
	int a = 10;
};

在定义一个子类对象里面包含子类的成员函数子类以public继承父类(下面会详细总结)

class son:public base//继承方式
{
public:
	void son_fun()
	{
		cout << "son" << endl;
	}
};

我们创建一个子类对象也是能够调用父类函数和变量的。(访问等级允许的情况下)。注意程序是先调用父类构造函数再调用子类构造函数

int main()
{
	son son1;
	son1.base_fun();//打印base
	cout << son1.a << endl;;//打印10
	return 0;
}

1.1访问等级

public: 可以被任意实体访问
protected: 只允许本类或子类的成员函数来访问
private: 只允许本类成员函数访问

下面是访问权限与继承方式总结:

父类中的访问权限 子类继承父类的继承方式 子类得到的访问权限
public public public
protected public protected
private public 子类无权访问
public protected protected
protected protected protected
private protected 子类无权访问
public private private
protected private private
private private 子类无权访问

总结:

1.子类public继承父类,则父类所有成员在子类中的访问权限都不会发生改变;

2.protected继承将父类中的public成员变为子类的protected成员;

3.private继承使得父类所有成员在子类中的访问权限变为private;

4.父类中的private继承成员不受继承方式的影响,子类永远无权访问;

5.对于父类来讲,尤其是父类成员函数,如果你不想让外面访问,就设置为private;如果你想让自己的子类能够访问,就设置为protected,如果你想公开,就设置为public。

1.2函数遮蔽

在C++继承中,子类会遮蔽父类中的同名函数,无论此函数的返回值,参数。也就是说父类和子类中的函数只要名字相同,子类中的函数就会遮蔽掉父类中的同名函数。

当父类与子类函数重名时可以加父类作用域来调用父类函数:

int main()
{
	son son1;
	son1.fun();//打印son
	son1.base::fun();//打印base
	return 0;
}

 

2.多态

父类指针可以new一个子类对象,但是子类指针不可以new一个父类对象代码如下:

	base* base1 = new son;//可以
	son son1 = new base;//报错

很显然我们想通过父类指针new一个子类对象来调用子类同名函数,但是事实上是不可以的。这样来说就比较离谱了,我们该怎么利用父类指针调用子类同名函数呢?下面引出虚函数的概念。

2.1虚函数

在父类中,这个成员函数的声明的开头我们加上virtual关键字就可以把该函数设置为虚函数。子类同名函数前也可以加上virtual关键字(不加也可以)因为当父类同名函数被置为虚函数之后子类同名函数自动变为虚函数。

class base
{
public:
	virtual void fun()
	{
		cout << "base" << endl;
	}
	int a = 10;
};
class son:public base
{
public:
	virtual void fun()
	{
		cout << "son" << endl;
	}
};
int main()
{
	base* base1 = new son;//可以
	base1->fun();//打印son
	delete base1;
	return 0;
}

用父类指针来调用一个虚成员函数时,执行的是动态绑定的fun函数,什么叫动态绑定呢?所谓动态其实就是在程序运行的时候(运行到调用fun函数这行代码时)才能知道调用的是哪个子类的fun函数,虚函数因为是在程序运行的时候才知道调用的是哪个虚函数,所以虚函数必须写它的定义部分(以备编译器随时调用)。

以上就是全部内容了,感谢大家观看~

C++ 继承与多态的基本用法_第1张图片

 

你可能感兴趣的:(c++,学习)