第十二章——组合与继承

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();
}

猜你喜欢

转载自blog.csdn.net/weixin_42183904/article/details/80555748
今日推荐