c++类的集成和派生,继承的兼容性原则

c++中可重用性是通过继承实现的

// 友元函数.cpp: 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include<math.h>
#include<iostream>

using namespace std;
class A
{
public:
	void func()

	{
		cout << "funA" << endl;
	}
	int a;
};
	//类B拥有A的成员变量 B has A//B依赖于A


class B {
public:
	A a;
	void funcB() {

	}
};
//高内聚 低耦合 B与A的耦合度高
//类C的成员方法需要类A的形参,C use A 
class C {
public:
	void func(A *a)
	{

	}
	
};
class D:public A {//D继承A  D is A 耦合度很高
	void funcD()
	{
		cout << "D  a= " << a << endl;
	}
};
int main()
{ 
	
    return 0;
}


父类与子类内存不相关,是相对独立的空间
在这里插入图片描述
子类空间比父类空间大一些

// 友元函数.cpp: 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include<math.h>
#include<iostream>
#include<string>
using namespace std;
class student {
public:
	student(int id, string name)
	{
		this->id = id;
		this->name = name;
	}
	void printl()
	{
		cout << "id= " << this->id << "name " << this->name << endl;
	}
private:
	int id;
	string name;
};
class student2 {
public:
	student2(int id, string name, int score)
	{
		this->id = id; this->name = name; this->score = score;
	}
	void printl()
	{
		cout << "id= " << this->id << "name " << this->name << endl;
		cout << "score= " << this->score << endl;
	}
private:
	int id;
	string name;
	int score;
};
//通过继承创建
class student3 :public student {
public:
	student3(int id,string name,int score):student(id,name)//通过父类的构造来初始化
	{
		this->score = score;

	}
	void printl()
	{
		student::printl();
		cout << "score= " << score << endl;
	}
private:
	int score;
};
int main()
{ 
	student3 s3(1, "z3", 80);
	s3.printl();

    return 0;
}


有关继承的名词定义

在这里插入图片描述
1.只要是父类中的private成员,不管什么继承方式,儿子都访问不了
2.如果是公有继承,儿子中的访问控制权限保持不变
3.如果是保护继承,除了父类的private成员,其余在儿子中都是protected
4.如果是私有private继承,所有都是Private成员(除了父类中的原有的私有成员变量)

三看原则:
1.看调用的成员变量是在类的内部还是类的外部
2.看儿子的继承方式
3.看当前变量在儿子中的变量在父亲中的访问控制权限

继承的兼容性原则

1.子类对象可以当作父类对象使用
2.子类对象可以直接赋值给父类对象
3.子类对象可以直接初始化父类对象
4.父类指针可以直接指向子类对象
5.父类引用可以直接引用子类对象

1.子类对象可以当作父类对象使用

 c.printP();//子类对象直接调用父类方法

2.子类对象可以直接赋值给父类对象

 Parent p;
child c=p

3.子类对象可以直接初始化父类对象

Parent p;
child c=p

用父类给子类赋值,由开辟的内存空间方面,我们可以想到
在这里插入图片描述
父类是不可能把子类初始化完成的
但是可以用子类给父类初始化

c对象占用的内存空间>=p对象占用的内存空间,能够填充满p对象的空间

4.父类指针可以直接指向子类对象

Parent *pp=NULL;//父类指针
Child *cp=NULL;
Parent p;
Child c;
cp=&c;
pp=&p;
//cp=&p//示图如下

cp=&p//错
在这里插入图片描述
这样指向的话,满足不了cp指针的需求,减少了cp原来的功能。
pp=&c;// 对 pp指针仍保留原来的功能(不能访问子类特有而父类没有的值),只是此时访问的是子类中的值

内存布局能够满足父类指针的全部需求,所以可以用儿子的对象地址给父类指针赋值。
在这里插入图片描述

发布了35 篇原创文章 · 获赞 2 · 访问量 2418

猜你喜欢

转载自blog.csdn.net/weixin_41375103/article/details/104390681