首页 > 编程语言 >继承与组合 C++(五)

继承与组合 C++(五)

时间:2022-12-08 17:33:25浏览次数:104  
标签:内嵌 组合 Point 继承 double C++ 对象

 

1.继承

如果A是基类,B是A的派生类,那么B将继承A的数据和函数。

 C++的“继承”特性可以提高程序的可复用性。正因为“继承”太有用、太容易用,才要防止乱用“继承”。我们应当给“继承”立一些使用规则。

如果类A和类B毫不相关,不可以为了使B的功能更多些而让B继承A的功能和属性。

若在逻辑上B是A的“一种”,并且A的所有功能和属性对B而言都有意义,则允许B继承A的功能和属性。

2. 组合

若在逻辑上A是B的“一部分”(a part of),则不允许B从A派生,而是要用A和其它东西组合出B。

例:

有这样一个类:

​class​​​​Eye​

​{​

​    ​​​​public​​​​:​​​​    ​​​​void​​​​Look(​​​​void​​​​);​

​};​

现在希望定义一个Head类,也想实现Look的功能,应该使用(组合)方法,实现代码重用。

 

 

“总结:优先使用对象组合,而不是继承”是面向对象设计的第二原则。

组合也叫“对象持有”,就是在类中定义另一类型的成员,继承会破坏类的独立性,增加系统的复杂性,一般系统的继承层次不超过3层。组合拥有良好的扩展性,支持动态组合,因此请优先考虑组合方法。

 

 

 类的组合其实描述的就是在一个类里内嵌了其他类的对象作为成员的情况,它们之间的关系是一种包含与被包含的关系。简单说,一个类中有若干数据成员是其他类的对象。以前的教程中我们看到的类的数据成员都是基本数据类型的或自定义数据类型的,比如int、float类型的或结构体类型的,现在我们知道了,数据成员也可以是类类型的。

       如果在一个类中内嵌了其他类的对象,那么创建这个类的对象时,其中的内嵌对象也会被自动创建。因为内嵌对象是组合类的对象的一部分,所以在构造组合类的对象时不但要对基本数据类型的成员进行初始化,还要对内嵌对象成员进行初始化。

当然,按照内嵌对象在组合类的声明中出现的次序,依次调用内嵌对象的构造函数,然后再执行本类的构造函数的函数体。


#include<iostream>
#include<cmath>
using namespace std;
class Point
{
private:
float x, y;
public:
Point(float xx, float yy)
{
cout << "point构造函数" << endl;
this->x = xx;
this->y = yy;
}
Point(Point &p)
{
x = p.x; y = p.y;
cout << "pont 拷贝构造函数" << endl;
}
float GetX(void){ return x; }
float GetY(void){ return y; }
};

class Distance
{
private:
Point p1, p2;
double dist;
public:
Distance(Point a, Point b);//构造函数
double GetDis(void){ return dist; }
};
Distance::Distance(Point a, Point b) :p1(a), p2(b)
{ //有了对象成员Point a传给p1(a), Point b传给p2(b),
//double p传给p,price=p;
double x = double(p1.GetX() - p2.GetX());
double y = double(p1.GetY() - p2.GetY());
dist = sqrt(x*x + y*y);
cout << "Distance构造函数:" << endl;
}

void main()
{
Point myp1(1, 1), myp2(4, 5);
Distance myd(myp1, myp2);
cout << "the distance is: ";
cout << myd.GetDis() << endl;
getchar();
}



标签:内嵌,组合,Point,继承,double,C++,对象
From: https://blog.51cto.com/u_6958388/5922964

相关文章

  • C++面试题(四)
     ​待续#include<QCoreApplication>#include<QTextStream>#include<iostream>usingnamespacestd;classString{public:String(constchar*str=NULL);......
  • 组合杂题选讲 #1
    问题描述题意:一个长度为\(n\)的由\(-1\)或\(1\)构成的序列\(a\),其中\(1\)的个数为\(c\)个。我们称一个子区间合法是指该子区间的数的和大于等于\(0\)。求证:所......
  • c++ stl总结
    前言本篇是c++总结系列的stl篇,重点讲解容器,及effectivestl的总结stl原理stl提供六大部件,这六大部件可以彼此搭配工作,这六大部件是:容器。各种数据结构迭代器。扮演容......
  • 使用ADDCOLUMNS 和 SUMMARIZE的组合
    先说结论,建议不要使用SUMMARIZE函数来增加扩展列,而使用ADDCOLUMNS和SUMMARIZE的组合。虽然SUMMARIZE函数被标记为弃用,但是有时使用起来真的非常方便。ADDCOLUMNS(......
  • windows下c++设置防火墙
     /*Copyright(c)MicrosoftCorporationSYNOPSISSamplecodefortheWindowsFirewallCOMinterface.*/#include<windows.h>#include<cr......
  • (黑马)C++提高编程笔记
    文章目录​​1模板​​​​1.1模板的概念​​​​1.2函数模板​​​​1.2.1函数模板语法​​​​1.2.2函数模板注意事项​​​​1.2.3函数模板案例​​​​1.2.4普通......
  • 《悟透javascript》学习笔记:X、深入继承
    引言      JavaScript不是按面向对象的思想设计的程序语言,所以它不具备像现有的面向对象的语言那样的功能,但是面向对象的思想是如此的深入人心,以至于JavaScript也削......
  • C++的语法 学习笔记1
    C++的语法学习笔记1  C++各种数据类型的默认值数值类型int/double/float/long0char'\0'string"\0"bool0,也就是false  数......
  • windows C++
    #include<Windows.h>LRESULTCALLBACKWndProc(HWNDhWnd,UINTuMsg,WPARAMwParam,LPARAMlParam){  switch(uMsg){  caseWM_DESTROY:    ......
  • 简介(Beginning Visual C++ 2013)
    欢迎阅读IvorHorton的《VisualC++2013入门》。通过本书,您可以使用Microsoft最新的应用程序开发系统VisualStudioProfessional2013成为一名有效的C++程序员。我的目标......