0
点赞
收藏
分享

微信扫一扫

C++继承和派生

就是耍帅 2022-01-18 阅读 128
c++

类之间的关系

类之间的关系主要有以下三种关系:has-A,uses-A 和 is-A。        


has-A:包含关系,用以描述一个类由多个“部件类”构成。实现has-A关系用类成员表示,即一个类中的数据成员是另一种已经定义的类。

uses-A:一个类部分地使用另一个类。通过类之间成员函数的相互联系,定义友员或对象参数传递实现。

is-A:该机制称为“继承”。关系具有传递性,不具有对称性。


继承和派生

        继承是类之间的一种重要关系。如一个B类继承类A,或从类A派生类B。则类A称为基类(父类),类B称为派生类(子类)。

继承和派生说明 

类继承关系语法形式

基类名列表构成

访问控制构成(表示派生类对基类的继承方式)

 说明


1、C++中的继承方式(public、private、protected)会影响子类的对外访问属性。

2、派生类继承了基类的全部成员变量和成员方法(除了构造和析构之外的成员方法)。

3、子类可以拥有父类没有的方法和属性


 不同的继承方式(public/protected/private)

1)C++中的继承方式会影响子类的对外访问属性

public继承:父类成员在子类中保持原有访问级别

private继承:父类成员在子类中变为private成员

protected继承:父类中public成员会变成protected

                              父类中protected成员仍然为protected

                              父类中private成员仍然为private

2)private成员在子类中依然存在,但是却无法访问到。不论哪种方式继承基类,派生类都不能直接使用基类的私有成员

3)C++中子类对外访问属性表

                                                  父类成员访问级别

     

      继

      承

      方

      式

public

proteced

private

public

public

proteced

private

proteced

proteced

proteced

private

private

private

private

private

示例 

public继承不会改变父类对外访问属性;

private继承会改变父类对外访问属性为private;

protected继承会部分改变父类对外访问属性。

//类的继承方式对子类对外访问属性影响

#include <cstdlib>
#include <iostream>

using namespace std;

//基类A
class A
{
private:
	int a;

protected:
	int b;

public:
	int c;

	A()
	{
		a = 0;
		b = 0;
		c = 0;
	}

	void set(int a, int b, int c)
	{
		this->a = a;
		this->b = b;
		this->c = c;
	}
};

//派生类B:公有继承类A
class B : public A
{
public:
	void print()
	{
		//cout<<"a = "<<a; //error:公有继承无法访问父类私有成员和函数
		cout<<"b = "<<b;
		cout<<"c = "<<endl;
	}
};

//派生类C:保护继承类A
class C : protected A
{
public:
	void print()
	{
		//cout<<"a = "<<a; //error:保护继承无法访问父类私有成员和函数        
		cout<<"b = "<<b;
		cout<<"c = "<<endl;
	}
};

//派生类D:私有继承类A
class D : private A
{
public:
	void print()
	{
		//cout<<"a = "<<a; //error:私有继承无法访问父类私有成员和函数        
		cout<<"b = "<<b<<endl; 
		cout<<"c = "<<c<<endl; 
	}
};

int main(int argc, char *argv[])
{
	A aa;
	B bb;
	C cc;
	D dd;

	aa.c = 100; //ok
	bb.c = 100; //ok
	//cc.c = 100; //error:
	//dd.c = 100; //error:

	aa.set(1, 2, 3);
	bb.set(10, 20, 30);
	//cc.set(40, 50, 60); //error:
	//dd.set(70, 80, 90); //error:

	bb.print();
	cc.print();
	dd.print();

	system("pause");
	return 0;
}
举报

相关推荐

0 条评论