天天看點

C++之動态多态

一、多态中的動态多态

1)動态多态通過一個關鍵字virtual構造一個虛函數,這樣,對象在調用某一個方法根據目前對象的所屬類去動态綁定對應方法。

2)虛函數:在一個類中,virtual關鍵字修飾的成員函數,我們将該函數叫虛函數。

虛函數分為:虛函數和純虛函數

純虛函數在類中隻有聲明,沒有定義,它的定義由子類對其重寫,為了和傳統的成員的聲明做區分函數的聲明結尾加上=0;

3)抽象類:凡是含有純虛函數的類叫做抽象類。這種類不能聲明對象,隻是作為基類為派生類服務。除非在派生類中完全實作基類中所有的的純虛函數,否則,派生類也變成了抽象類,不能執行個體化對象。多用來實作一些接口。

4)動态多态它是建立在繼承前提下,在基類中聲明了一個虛成員函數,此時,其子類對其重寫時,可以不用顯示指定virtual,對于基類中聲明的虛函數,需要靠基類來實作重寫。

5)從面相對象的角度,多态就是在調用對象的方法,根據目前對象的不同所表現出的不同行為。

6)override關鍵字的使用

在派生類的成員函數中使用override時,如果基類中無此函數,或者基類中的函數并不是虛函數,編譯器會給出相關錯誤資訊。例如

#include <iostream>
using namespace std;
class per
{
public:
   //string name;
   virtual void eat() 
   {
     cout<<"parent"<<endl;
     }

};

class stu : public per
{
public:
   virtual void eat()
   {
      cout << "stu can eatting" << endl;
   }
};

class Tea : public per
{
public :
   virtual void eat() override
   {
      cout << "tea can eatting" << endl;
   }
};

void make_obj(per& a)
{
   a.eat();
}

int main()
{
   stu s1;
   Tea s2;
   make_obj(s1);
   make_obj(s2);
   return 0;
}      
C++之動态多态
C++之動态多态

空類1

隻有資料成員的情況8

帶靜态資料成員的情況2

帶資料成員和普通成員函數的情況8

帶資料成員和虛成員函數的情況12

例子:

#include <iostream>
using namespace std;



class per1
{
  

};
class per2
{
public:
  int a;
  short b;
};

class per3
{
public:
  static int a;
  short b;
  void get()
  {
    cout << sizeof(a) << endl;
  }

};

class per4
{
public:
  int a;
  short b;
  void print()
  {
    cout << "3333" << endl;
  }
};
class per5
{
public:
  int a;
  short b;
  virtual void print()
  {
    cout << "3333" << endl;
  }
  virtual void print1()
  {
    cout << "33331" << endl;
  }
};

class per6
{
public:
  enum data {
    AA,
    BB,
    CC
  };
};

int main()
{
  //建立的類如果沒有任何的成員,占用1個位元組,用這個位元組辨別不同的對象
  per1 a1;
  cout << "空類" << sizeof(a1) << endl;
  //隻有資料成員
  per2 a2;
  cout << "隻有資料成員的情況" << sizeof(a2) << endl;
  per3 a3;
  a3.get();
  cout << "帶靜态資料成員的情況" << sizeof(a3) << endl;
  per4 a4;
  cout << "帶資料成員和普通成員函數的情況" << sizeof(a4) << endl;

  per5 a5;
  cout << "帶資料成員和虛成員函數的情況" << sizeof(a5) << endl;

  static int a;
  cout << "static a =" << sizeof(a) << endl;

  per6 a6;
  cout << per6::AA << endl;
  cout << sizeof(per6) << endl;

  enum data1 {
    AA,
    BB,
    CC
  };
  cout << sizeof(data1) << endl;


  return 0;
}      
#include <iostream>
#include <string>
using namespace std;

template <class A, class  B>  // 模闆聲明
class myper
{
public:
  A name;
  A sex;
  B age;
  myper(A n, A s, B a);

  myper() {
    name = "sd";
    sex = "a3";
    age = 12;
  }
  void print()
  {
    cout << this->name << this->age << this->sex;
  }
  void print1();


};

template <class A, class B>
myper<A, B>::myper(A n, A s, B a) :name(n), sex(s), age(a)
{
  ;
}
//一個類被定義為類模闆,無論内部的成員函數是否用到類型符号,在外部定義時都需要
//加上模闆聲明
template <class A, class B>
void myper<A, B>::print1()
{
  cout << 3333;
}
int main()
{
  myper<string, int> p1("sdfds", "waa", 14);
  p1.print();
  //add(10, "ljs"); //使用模闆函數:自動推導
  //顯示指定類型使用模闆函數:函數傳回類型 函數名<顯式指定的類型,...>(參數清單);
  //add<int,string>(33, "kk");
  return 0;
}