一、多态中的動态多态
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;
}

空類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;
}