1.组合:用已有类的对象作为新定义类的数据成员
2.继承:在一个已存在的类的基础上,对他进行拓展,形成一个新类
3.子类可以赋值给基类,基类不能赋值给子类
4.派生类函数同名隐藏(重定义基类函数)
5.提供类的含参构造函数时,应加上一个默认的构造函数(无参)以免对派生类对象初始化时没有显式调用基类构造函数而出错
6.多基类继承(class derived:public base1,public base2)
扫描二维码关注公众号,回复:
1501839 查看本文章
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(); }