继承
发生在类与类之间,通过继承机制,可以利用已有的数据类型来定义新的数据类型,
所定义的新的数据不仅拥有新定义的成员,还有继承来的成员。
已存在用来派生其他类的类叫基类或父类,由已存在的类派生出来的类叫派生类或者子类。
继承步骤
1、吸收基类成员
2、覆盖基类同名成员
3、添加新成员
注意:析构、构造函数不能继承
单继承:只有一个父类
单继承定义格式:
class 派生类名:继承方式 基类名
{
// 新成员
};
public:基类公有成员和保护成员保持原有的状态,私有不能在派生类中访问
private:基类公有成员和保护成员都作为派生类的私有成员
protected:基类公有成员和保护成员都作为派生类的保护成员
通常为public
#include<iostream>
using namespace std;
class Point
{
private:
int xp;
int yp;
public:
Point(int x=0,int y=0)
{
xp=x;
yp=y;
}
void show()
{
cout<<"父类:xp"<<xp<<",yp:" <<yp<<endl;
}
protected:
void setXP(int x)
{
xp=x;
}
int getXP()
{
return xp;
}
void setYP(int y)
{
yp=y;
}
int getYP()
{
return yp;
}
};
class Point3D:public Point
{
private:
int zp;
public:
Point3D(int x=0,int y=0,int z=0):Point(x,y),zp(z)
{
}
void show()
{
cout<<"xp:"<<getXP()<<"yp:"<<getYP()<<"zp:"<<zp<<endl;
}
};
int main()
{
Point3D a(3,5,7);
a.show();
return 0;
}
多继承
多继承定义格式:
class 派生类名:继承方式 基类名,继承方式 基类名.......
{
};
#include<iostream>
using namespace std;
class A
{
public:
int ax;
A(int x)
{
ax=x;
}
void printA()
{
cout<<"ax:"<<ax<<endl;
}
};
class B
{
public:
int bx;
B(int x)
{
bx=x;
}
void printB()
{
cout<<"bx:"<<bx<<endl;
}
};
class C:public A,public B
{
public:
C(int x,int y):A(x),B(y)
{
}
};
int main()
{
C asd(5,6);
asd.printA();
asd.printB();
return 0;
}
多继承可能遇到的问题
1、多继承二义性 -- 函数命名冲突 -- 调用的时候 加 类名::指定是哪一个类里面的成员函数
2、共基类 -- 多个共基类拷贝 -- 加 类名:: 或 虚继承
#include<iostream>
using namespace std;
class A
{
public:
int ax;
A(int x=0)
{
ax = x;
}
void printA()
{
cout << "ax:" << ax << endl;
}
void show()
{
cout << "我是Ashow" << endl;
}
};
class B
{
public:
int bx;
B(int x=0)
{
bx = x;
}
void printB()
{
cout << "bx:" << bx << endl;
}
void show()
{
cout << "我是Bshow" << endl;
}
};
class C:public A,public B
{
public:
C(int x,int y):A(x),B(y)
{
}
};
int main()
{
C obj(1,5);
obj.printA();
obj.printB();
obj.A::show();
obj.B::show();
return 0;
}
#include<iostream>
using namespace std;
class D
{
public:
int a;
void show()
{
cout << "我是基类Dshow" << endl;
}
};
class A:virtual public D
{
};
class B:virtual public D
{
};
class C:public A,public B
{
};
int main()
{
C obj;
obj.show();
return 0;
}
构造函数和析构函数执行顺序
构造函数和析构函数时不能继承的,只能自己使用自己的构造函数和析构函数
调用基类的构造函数必须在派生类的构造函数中使用初始化表达式的形式
构造函数执行顺序:先基类再派生类
析构函数执行顺序:先派生类再基类
#include<iostream>
using namespace std;
class A
{
public:
A()
{
cout << " 基类 构造函数" << endl;
}
~A()
{
cout << " 基类 析构函数" << endl;
}
};
class B:public A
{
public:
B()
{
cout << " 子类 构造函数" << endl;
}
~B()
{
cout << " 子类 析构函数" << endl;
}
};
int main()
{
B obj;
return 0;
}
继承:学生继承人类,老师继承人类
组合:人的五官由鼻子、眼睛、嘴巴、耳朵、眉毛组成