1.组合:用已有类的对象作为新定义类的数据成员
2.继承:在一个已存在的类的基础上,对他进行拓展,形成一个新类
3.子类可以赋值给基类,基类不能赋值给子类
4.派生类函数同名隐藏(重定义基类函数)
5.提供类的含参构造函数时,应加上一个默认的构造函数(无参)以免对派生类对象初始化时没有显式调用基类构造函数而出错
6.多基类继承(class derived:public base1,public base2)
7.多态性的实现:指针或引用,继承,虚函数(virtual告诉编译器看到对象是什么类时再决定用那个类的成员,即运行时的多态性)
8.构造函数不能是虚函数,但析构函数最好是虚函数
9.纯虚函数(virtual 返回类型 函数名(参数表)=0;):在基类中的信息不够,故只能定义为纯虚函数,纯虚函数可以作为类的接口,告诉类具有哪些功能
//多基类继承
#include<iostream>
using namespace std;
class base1
{ public:
void print()
{
cout<<"ss";
}
};
class base2
{
public:
void print()
{
cout<<"sss";
}
};
class der:public base1,public base2
{
public:
void print()
{
cout<<"ssdd";
}
};
//虚函数的定义
#include<iostream>
using namespace std;
class shape
{
protected:
int x,y;
public:
shape(double xx,double yy) {x=xx; y=yy;}
virtual double area() const {return 0.0;}
virtual void display() const {cout<<x<<endl<<y<<endl;}
};
class rectangle:public shape
{
protected:
double h;
double w;
public:
rectangle(double xx,double yy,double ww,double hh):shape(xx,yy),w(ww),h(hh) {}
double area() const {return w*h;}
void display() const {cout<<x<<endl<<y<<endl<<w<<endl<<h;}
};
int main()
{
shape s(1,2),*sr;
sr=&s;
sr->display();
cout<<sr->area()<<endl;//sr.area()不行?
rectangle rect(3,4,5,6);
sr=▭//基类对象现在可以有派生类新增的数据
sr->display();
cout<<endl;
cout<<sr->area()<<endl;
}
//派生类作为基类
#include<iostream>
using namespace std;
class base
{ int x;
public:
base(int x1=1) {x=x1; cout<<"A"<<endl;}
~base() {cout<<"a"<<endl;}
};
class sc:public base
{
int x,y;
public:
sc(int x1,int y1=2):base(x1) {y=y1; cout<<"B"<<endl;}
~sc() {cout<<"b"<<endl;}
};
class kd:public sc
{
int x,y,z;
public:
kd(int x1,int y1,int z1=3):sc(x1,y1) {z=z1; cout<<"C"<<endl;}
~kd() {cout<<"c"<<endl;}
};
int main()
{
//kd drant(1,2);//为什么不能kd durant; drant.kd(4,5,6);
}
//纯虚函数的定义
#include<iostream>
using namespace std;
class base
{
public:
virtual void f()=0;
};
class der:public base
{
public:
void f() {cout<<"kkkk";}
};
int main()
{
//base kd;抽象类对象不能定义
der kd;
kd.f();
}