码迷,mamicode.com
首页 > 编程语言 > 详细

C++笔记------类的继承和多态

时间:2018-04-05 15:29:37      阅读:224      评论:0      收藏:0      [点我收藏+]

标签:虚基类   类的方法   turn   c++笔记   com   保存   数组的指针   地址   纯虚函数   

从已有的类派生出新的类,叫继承。派生类继承了基类的特征和方法。
公有继承:基类的公有成员成为派生类的公有成员;基类的私有成员成为派生类的一部分,但只能通过基类成员方法和保护方法访问。
派生类构造函数,通过成员初始化列表的方式指明使用的基类构造函数,并传递基类信息。非构造函数不能使用初始化列表语法。

派生类可以使用基类不是私有的方法。

class A
{
private:
    int num;
public:
    int a;
public:
    A():a(10),num(1)
    {}
    void Show_num()
    {
        cout << num <<endl;
    }
    ~A(){}
};
class B:public A
{
public:
    int b;
    B():A(),b(5){}
    ~B(){}
};

int main()
{
    B b1;
    cout << b1.b <<" " << b1.a <<endl;
    b1.Show_num();   //b1只能通过基类公有方法访问私有数据。
}

在派生类的对象创建中,首先是虚基类的构造函数,并按照声明顺序构造。然后是非虚基类的构造函数,
之后是成员对象的构造函数,最后是派生类自己的构造函数。
派生类对象过期先调用派生类析构函数,然后再调用基类析构函数。

class D1
{
public:
    D1()
    {
        cout << "D1 create" <<endl;
    }
    ~D1()
    {
        cout <<  "D1 free \n";
    }
};
class D2
{
public:
    D2()
    {
        cout << "D2 create" <<endl;
    }
    ~D2()
    {
        cout <<  "D2 free \n";
    }
};
class D3
{
public:
    D3()
    {
        cout << "D3 create" <<endl;
    }
    ~D3()
    {
        cout <<  "D3 free \n";
    }
};
class D4:public D1,virtual public D2
{
public:
    D3 tt;
    D4():tt()
    {
        cout << "D4 create" <<endl;
    }
    ~D4()
    {
        cout <<  "D4 free \n";
    }
};
int main()
{
    D4 tt;
    return 0;
}

技术分享图片

1.子类能给父类赋值(向上转换),但父类不可以给子类赋值

2.基类的指针可以指向派生类,基类的引用可以引用派生类对象。但只能调用基类的方法。派生类指针和引用不可以指向基类和引用基类。重新定义基类方法将隐藏基类方法。

派生类可以使用作用域解析符来调用基类方法。

class D1
{
public:
    D1()
    {
        cout << "D1 create" <<endl;
    }
    void show()
    {
        cout << "D1 show"<< endl;
    }

      void show1()
      {
          cout <<" D1 show1()\n";
      }

      ~D1()

    {
        cout <<  "D1 free \n";
    }
};
class D2
{
public:
    D2()
    {
        cout << "D2 create" <<endl;
    }
    void show()
    {
        cout << "D2 show" <<endl;
    }
    ~D2()
    {
        cout <<  "D2 free \n";
    }
};
class D4:public D1,virtual public D2
{
public:
    D4():tt()
    {
        cout << "D4 create" <<endl;
    }
    void show()
    {
        cout << "D4 show" <<endl;
    }

      void show1(int i)
     {
          cout << i <<" D4 show1()\n";
     }

~D4()
    {
        cout <<  "D4 free \n";
    }
};
int main()
{
    D4 tt;
    D2 t2;
    D1 t1;
    t1 = tt; 
    //tt = t1;  //报错 
    D2* t3 = &tt;
    D1 & t4=tt; 
    t3->show();      //调用D2的show函数
    t4.show();        //调用D1的show函数
    tt.show();        //调用D1的show函数
    tt.D1::show();  //调用D1的show函数
    //tt.show1();   //报错,显示没有show1()函数
tt.show1(2);
return 0; }

多态:根据调用的对象具有不同行为。

主要实现机制是1.重新定义基类方法 2.使用虚方法
使用virtual,程序根据引用或指针的对象选择方法。没有virtual,则根据引用或指针类型调用方法。
方法在基类中定义为虚方法它在派生类中自动成为虚方法,vistual只用在类声明的方法原型中。
将基类的析构函数定义为虚析构函数,为了保护让程序正确调用析构函数。
编译器对非虚方法采用静态联编,对虚方法采用动态联编。静态联编效率比动态联编高。
编译器处理虚函数是为对象添加一个隐藏成员,该成员保存了指向函数的地址数组的指针,称为虚函数表。
友元不能是虚函数,因为友元不是类成员,只有类成员才能是虚函数。
private与protected区别
  派生类成员可以直接访问基类保护成员,但不能直接访问基类私有成员。
  保护访问控制让派生类能够访问公众不能使用的内部函数。
纯虚函数,可以不提供实现代码。

virtual void show() = 0 ;

抽象基类(ABC)包含纯虚函数的类,不能创建对象。

C++笔记------类的继承和多态

标签:虚基类   类的方法   turn   c++笔记   com   保存   数组的指针   地址   纯虚函数   

原文地址:https://www.cnblogs.com/zhangzeze/p/8722448.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!