面向?qū)ο缶幊?/h1>
類
C++ 在 C 語(yǔ)言的基礎(chǔ)上增加了面向?qū)ο缶幊逃保珻++ 支持面向?qū)ο蟪绦蛟O(shè)計(jì)。類是 C++ 的核心特性,用戶定義的類型。
class Student {
int i; //默認(rèn) private
public:
Student(int i,int j,int k):i(i),j(j),k(k){}; //構(gòu)造方法
~Student(){}; //析構(gòu)方法
private:
int j;
protected:
int k;
};
Student student(1,2,3); //調(diào)用構(gòu)造方法 棧
//出方法釋放student 調(diào)用析構(gòu)方法
//動(dòng)態(tài)內(nèi)存(堆)
Student *student = new Student(1,2,3);
//釋放
delete student;
student = 0;
類的析構(gòu)函數(shù)是類的一種特殊的成員函數(shù)韩脑,它會(huì)在每次刪除所創(chuàng)建的對(duì)象時(shí)執(zhí)行(不需要手動(dòng)調(diào)用)。
private:可以被該類中的函數(shù)粹污、友元函數(shù)訪問(wèn)段多。 不能被任何其他訪問(wèn),該類的對(duì)象也不能訪問(wèn)壮吩。
protected:可以被該類中的函數(shù)进苍、子類的函數(shù)、友元函數(shù)訪問(wèn)鸭叙。 但不能被該類的對(duì)象訪問(wèn)觉啊。
public:可以被該類中的函數(shù)、子類的函數(shù)沈贝、友元函數(shù)訪問(wèn)杠人,也可以被該類的對(duì)象訪問(wèn)。
常量函數(shù)
函數(shù)后寫上const宋下,表示不會(huì)也不允許修改類中的成員嗡善。
class Student {
int i;
public:
Student() {}
~Student() {}
// 常量函數(shù)
void setName(char* _name) const {
//錯(cuò)誤 不能修改name 去掉const之后可以
name = _name;
}
private:
int j;
char *name;
protected:
int k;
};
友元
類的友元函數(shù)是定義在類外部,但有權(quán)訪問(wèn)類的所有私有(private)成員和保護(hù)(protected)成員
友元可以是一個(gè)函數(shù)学歧,該函數(shù)被稱為友元函數(shù)滤奈;友元也可以是一個(gè)類,該類被稱為友元類撩满,在這種情況下蜒程,整個(gè)類及其所有成員都是友元。
友元函數(shù)
class Student {
int i;
public:
Student() {}
~Student() {}
void setName(char* _name) {
name = _name;
}
friend void printName(Student *student);
private:
int j;
char *name;
protected:
int k;
};
void printName(Student *student) {
//能夠使用student中私有的name屬性
cout << student->name << endl;
}
Student *student = new Student;
student->setName("Lance");
printName(student);
友元類
class Student {
int i;
public:
Student() {}
~Student() {}
void setName(char* _name) {
name = _name;
}
friend void printName(Student *student);
//友元類
friend class Teacher;
private:
int j;
char *name;
protected:
int k;
};
class Teacher {
public:
void call(Student *student) {
//能夠使用student中私有的name屬性
cout << "call:" << student->name << endl;
}
};
靜態(tài)成員
和Java一樣伺帘,可以使用static來(lái)聲明類成員為靜態(tài)的
當(dāng)我們使用靜態(tài)成員屬性或者函數(shù)時(shí)候 需要使用 域運(yùn)算符 ::
//Instance.h
#ifndef INSTANCE_H
#define INSTANCE_H
class Instance {
public:
static Instance* getInstance();
private:
static Instance *instance;
};
#endif
//Instance.cpp
#include "Instance.h"
Instance* Instance::instance = 0;
Instance* Instance::getInstance() {
//C++11以后昭躺,編譯器保證內(nèi)部靜態(tài)變量的線程安全性
if (!instance) {
instance = new Instance;
}
return instance;
}
重載函數(shù)
C++ 允許在同一作用域中的某個(gè)函數(shù)和運(yùn)算符指定多個(gè)定義,分為函數(shù)重載和運(yùn)算符重載伪嫁。
函數(shù)重載
void print(int i) {
cout << "整數(shù)為: " << i << endl;
}
void print(double f) {
cout << "浮點(diǎn)數(shù)為: " << f << endl;
}
操作符重載
C++允許重定義或重載大部分 C++ 內(nèi)置的運(yùn)算符
函數(shù)名是由關(guān)鍵字 operator 和其后要重載的運(yùn)算符符號(hào)構(gòu)成的
重載運(yùn)算符可被定義為普通的非成員函數(shù)或者被定義為類成員函數(shù)
C++ 在 C 語(yǔ)言的基礎(chǔ)上增加了面向?qū)ο缶幊逃保珻++ 支持面向?qū)ο蟪绦蛟O(shè)計(jì)。類是 C++ 的核心特性,用戶定義的類型。
class Student {
int i; //默認(rèn) private
public:
Student(int i,int j,int k):i(i),j(j),k(k){}; //構(gòu)造方法
~Student(){}; //析構(gòu)方法
private:
int j;
protected:
int k;
};
Student student(1,2,3); //調(diào)用構(gòu)造方法 棧
//出方法釋放student 調(diào)用析構(gòu)方法
//動(dòng)態(tài)內(nèi)存(堆)
Student *student = new Student(1,2,3);
//釋放
delete student;
student = 0;
類的析構(gòu)函數(shù)是類的一種特殊的成員函數(shù)韩脑,它會(huì)在每次刪除所創(chuàng)建的對(duì)象時(shí)執(zhí)行(不需要手動(dòng)調(diào)用)。
private:可以被該類中的函數(shù)粹污、友元函數(shù)訪問(wèn)段多。 不能被任何其他訪問(wèn),該類的對(duì)象也不能訪問(wèn)壮吩。
protected:可以被該類中的函數(shù)进苍、子類的函數(shù)、友元函數(shù)訪問(wèn)鸭叙。 但不能被該類的對(duì)象訪問(wèn)觉啊。
public:可以被該類中的函數(shù)、子類的函數(shù)沈贝、友元函數(shù)訪問(wèn)杠人,也可以被該類的對(duì)象訪問(wèn)。
函數(shù)后寫上const宋下,表示不會(huì)也不允許修改類中的成員嗡善。
class Student {
int i;
public:
Student() {}
~Student() {}
// 常量函數(shù)
void setName(char* _name) const {
//錯(cuò)誤 不能修改name 去掉const之后可以
name = _name;
}
private:
int j;
char *name;
protected:
int k;
};
類的友元函數(shù)是定義在類外部,但有權(quán)訪問(wèn)類的所有私有(private)成員和保護(hù)(protected)成員
友元可以是一個(gè)函數(shù)学歧,該函數(shù)被稱為友元函數(shù)滤奈;友元也可以是一個(gè)類,該類被稱為友元類撩满,在這種情況下蜒程,整個(gè)類及其所有成員都是友元。
class Student {
int i;
public:
Student() {}
~Student() {}
void setName(char* _name) {
name = _name;
}
friend void printName(Student *student);
private:
int j;
char *name;
protected:
int k;
};
void printName(Student *student) {
//能夠使用student中私有的name屬性
cout << student->name << endl;
}
Student *student = new Student;
student->setName("Lance");
printName(student);
class Student {
int i;
public:
Student() {}
~Student() {}
void setName(char* _name) {
name = _name;
}
friend void printName(Student *student);
//友元類
friend class Teacher;
private:
int j;
char *name;
protected:
int k;
};
class Teacher {
public:
void call(Student *student) {
//能夠使用student中私有的name屬性
cout << "call:" << student->name << endl;
}
};
和Java一樣伺帘,可以使用static來(lái)聲明類成員為靜態(tài)的
當(dāng)我們使用靜態(tài)成員屬性或者函數(shù)時(shí)候 需要使用 域運(yùn)算符 ::
//Instance.h
#ifndef INSTANCE_H
#define INSTANCE_H
class Instance {
public:
static Instance* getInstance();
private:
static Instance *instance;
};
#endif
//Instance.cpp
#include "Instance.h"
Instance* Instance::instance = 0;
Instance* Instance::getInstance() {
//C++11以后昭躺,編譯器保證內(nèi)部靜態(tài)變量的線程安全性
if (!instance) {
instance = new Instance;
}
return instance;
}
C++ 允許在同一作用域中的某個(gè)函數(shù)和運(yùn)算符指定多個(gè)定義,分為函數(shù)重載和運(yùn)算符重載伪嫁。
void print(int i) {
cout << "整數(shù)為: " << i << endl;
}
void print(double f) {
cout << "浮點(diǎn)數(shù)為: " << f << endl;
}
C++允許重定義或重載大部分 C++ 內(nèi)置的運(yùn)算符
函數(shù)名是由關(guān)鍵字 operator 和其后要重載的運(yùn)算符符號(hào)構(gòu)成的
重載運(yùn)算符可被定義為普通的非成員函數(shù)或者被定義為類成員函數(shù)
成員函數(shù)
class Test1 {
public:
Test1(){}
//定義成員函數(shù)進(jìn)行重載
//返回對(duì)象 調(diào)用拷貝構(gòu)造函數(shù) 釋放函數(shù)內(nèi) t 對(duì)象
//引用類型(Test1&) 沒(méi)有復(fù)制對(duì)象 返回的是 t 對(duì)象本身 t會(huì)被釋放 所以會(huì)出現(xiàn)問(wèn)題(數(shù)據(jù)釋放不徹底就不一定)
// 可以輸出 t 與 t3 地址查看
Test1 operator+(const Test1& t1) {
Test1 t;
t.i = this->i + t1.i;
return t;
}
//拷貝構(gòu)造函數(shù) (有默認(rèn)的)
Test1(const Test1& t){
//淺拷貝
this->i = t.i;
cout << "拷貝" << endl;
//如果動(dòng)態(tài)申請(qǐng)內(nèi)存 需要深拷貝
};
int i;
};
Test1 t1;
Test1 t2;
t1.i = 100;
t2.i = 200;
//發(fā)生兩次拷貝
// C++真正的臨時(shí)對(duì)象是不可見(jiàn)的匿名對(duì)象
//1领炫、拷貝構(gòu)造一個(gè)無(wú)名的臨時(shí)對(duì)象,并返回這個(gè)臨時(shí)對(duì)象
//2张咳、由臨時(shí)對(duì)象拷貝構(gòu)造對(duì)象 t3
//語(yǔ)句結(jié)束析構(gòu)臨時(shí)對(duì)象
Test1 t3 = t1 + t2;
cout << t3.i << endl;
Xcode上玩帝洪,使用的g++編譯器會(huì)進(jìn)行 返回值優(yōu)化(RVO似舵、NRVO) 從而看不到拷貝構(gòu)造函數(shù)的調(diào)用。
可以加入 "-fno-elide-constructors" 取消GNU g++優(yōu)化
<u>對(duì)windows vs編譯器cl.exe無(wú)效葱峡,VS Debug執(zhí)行RVO砚哗,Release執(zhí)行NRVO</u>
RVO(Return Value Optimization):消除函數(shù)返回時(shí)創(chuàng)建的臨時(shí)對(duì)象
NRVO(Named Return Value Optimization):屬于 RVO 的一種技術(shù), 直接將要初始化的對(duì)象替代掉返回的局部對(duì)象進(jìn)行操作。
非成員函數(shù)
class Test2 {
public:
int i;
};
//定義非成員函數(shù)進(jìn)行 + 重載
Test2 operator+(const Test2& t21, const Test2& t22) {
Test2 t;
t.i = t21.i + t22.i;
return t;
}
Test2 t21;
Test2 t22;
t21.i = 100;
t22.i = 200;
Test2 t23 = t21 + t22;
cout << t23.i << endl;
允許重載的運(yùn)算符
void *operator new (size_t size)
{
cout << "新的new:" << size << endl;
return malloc(size);
}
void operator delete(void *p)
{
//釋放由p指向的存儲(chǔ)空間
cout << "新的delete" << endl;
free(p);
}
... ...
繼承
class A:[private/protected/public] B
默認(rèn)為private繼承
A是基類,B稱為子類或者派生類
方式 | 說(shuō)明 |
---|---|
public | 基類的public喷屋、protected成員也是派生類相應(yīng)的成員琳拨,基類的private成員不能直接被派生類訪問(wèn),但是可以通過(guò)調(diào)用基類的公有和保護(hù)成員來(lái)訪問(wèn)屯曹。 |
protected | 基類的公有和保護(hù)成員將成為派生類的保護(hù)成員 |
private | 基類的公有和保護(hù)成員將成為派生類的私有成員 |
class Parent {
public:
void test() {
cout << "parent" << endl;
}
};
class Child : Parent {
public:
void test() {
// 調(diào)用父類 方法
Parent::test();
cout << "child" << endl;
}
};
多繼承
一個(gè)子類可以有多個(gè)父類狱庇,它繼承了多個(gè)父類的特性。
class <派生類名>:<繼承方式1><基類名1>,<繼承方式2><基類名2>,…
多態(tài)
多種形態(tài)恶耽。當(dāng)類之間存在層次結(jié)構(gòu)密任,并且類之間是通過(guò)繼承關(guān)聯(lián)時(shí),就會(huì)用到多態(tài)偷俭。
靜態(tài)多態(tài)(靜態(tài)聯(lián)編)是指在編譯期間就可以確定函數(shù)的調(diào)用地址浪讳,通過(guò)函數(shù)重載和模版(泛型編程)實(shí)現(xiàn)
動(dòng)態(tài)多態(tài)(動(dòng)態(tài)聯(lián)編)是指函數(shù)調(diào)用的地址不能在編譯器期間確定,必須需要在運(yùn)行時(shí)才確定 ,通過(guò)繼承+虛函數(shù) 實(shí)現(xiàn)
虛函數(shù)
class Parent {
public:
void test() {
cout << "parent" << endl;
}
};
class Child :public Parent {
public:
void test() {
cout << "child" << endl;
}
};
Parent *c = new Child();
// 編譯期間 確定c 為 parent 調(diào)用parent的test方法
c->test();
//修改Parent為virtual 虛函數(shù) 動(dòng)態(tài)鏈接,告訴編譯器不要靜態(tài)鏈接到該函數(shù)
virtual void test() {
cout << "parent" << endl;
}
//動(dòng)態(tài)多態(tài) 調(diào)用Child的test方法
c->test();
構(gòu)造函數(shù)任何時(shí)候都不可以聲明為虛函數(shù)
析構(gòu)函數(shù)一般都是虛函數(shù),釋放先執(zhí)行子類再執(zhí)行父類
純虛函數(shù)
class Parent {
public:
//純虛函數(shù) 繼承自這個(gè)類需要實(shí)現(xiàn) 抽象類型
virtual void test() = 0;
};
class Child :public Parent {
public:
void test(){}
};
模板
模板是泛型編程的基礎(chǔ)
函數(shù)模板
函數(shù)模板能夠用來(lái)創(chuàng)建一個(gè)通用的函數(shù)涌萤。以支持多種不同的形參淹遵。避免重載函數(shù)的函數(shù)體反復(fù)設(shè)計(jì)口猜。
template <typename T>
T max(T a,T b)
{
// 函數(shù)的主體
return a > b ? a : b;
}
//代替了
int max(int a,int b)
int max(float a,float b)
類模板(泛型類)
為類定義一種模式。使得類中的某些數(shù)據(jù)成員透揣、默寫成員函數(shù)的參數(shù)济炎、某些成員函數(shù)的返回值,能夠取隨意類型
常見(jiàn)的 容器比如 向量 vector <int> 或 vector <string> 就是模板類
template<class E,class T>
class Queue {
public:
T add(E e,T t){
return e+t;
}
};
Queue<int,float> q;
q.add(1,1.1f) = 2.1f
面向?qū)ο缶幊?/h1>
[TOC]
類
C++ 在 C 語(yǔ)言的基礎(chǔ)上增加了面向?qū)ο缶幊烫适担珻++ 支持面向?qū)ο蟪绦蛟O(shè)計(jì)冻辩。類是 C++ 的核心特性,用戶定義的類型拆祈。
class Student {
int i; //默認(rèn) private
public:
Student(int i,int j,int k):i(i),j(j),k(k){}; //構(gòu)造方法
~Student(){}; //析構(gòu)方法
private:
int j;
protected:
int k;
};
Student student(1,2,3); //調(diào)用構(gòu)造方法 棧
//出方法釋放student 調(diào)用析構(gòu)方法
//動(dòng)態(tài)內(nèi)存(堆)
Student *student = new Student(1,2,3);
//釋放
delete student;
student = 0;
類的析構(gòu)函數(shù)是類的一種特殊的成員函數(shù)恨闪,它會(huì)在每次刪除所創(chuàng)建的對(duì)象時(shí)執(zhí)行(不需要手動(dòng)調(diào)用)。
private:可以被該類中的函數(shù)放坏、友元函數(shù)訪問(wèn)咙咽。 不能被任何其他訪問(wèn),該類的對(duì)象也不能訪問(wèn)淤年。
protected:可以被該類中的函數(shù)钧敞、子類的函數(shù)、友元函數(shù)訪問(wèn)麸粮。 但不能被該類的對(duì)象訪問(wèn)溉苛。
public:可以被該類中的函數(shù)、子類的函數(shù)弄诲、友元函數(shù)訪問(wèn)愚战,也可以被該類的對(duì)象訪問(wèn)。
常量函數(shù)
函數(shù)后寫上const齐遵,表示不會(huì)也不允許修改類中的成員寂玲。
class Student {
int i;
public:
Student() {}
~Student() {}
// 常量函數(shù)
void setName(char* _name) const {
//錯(cuò)誤 不能修改name 去掉const之后可以
name = _name;
}
private:
int j;
char *name;
protected:
int k;
};
友元
類的友元函數(shù)是定義在類外部,但有權(quán)訪問(wèn)類的所有私有(private)成員和保護(hù)(protected)成員
友元可以是一個(gè)函數(shù)梗摇,該函數(shù)被稱為友元函數(shù)拓哟;友元也可以是一個(gè)類,該類被稱為友元類伶授,在這種情況下断序,整個(gè)類及其所有成員都是友元。
友元函數(shù)
class Student {
int i;
public:
Student() {}
~Student() {}
void setName(char* _name) {
name = _name;
}
friend void printName(Student *student);
private:
int j;
char *name;
protected:
int k;
};
void printName(Student *student) {
//能夠使用student中私有的name屬性
cout << student->name << endl;
}
Student *student = new Student;
student->setName("Lance");
printName(student);
友元類
class Student {
int i;
public:
Student() {}
~Student() {}
void setName(char* _name) {
name = _name;
}
friend void printName(Student *student);
//友元類
friend class Teacher;
private:
int j;
char *name;
protected:
int k;
};
class Teacher {
public:
void call(Student *student) {
//能夠使用student中私有的name屬性
cout << "call:" << student->name << endl;
}
};
靜態(tài)成員
和Java一樣糜烹,可以使用static來(lái)聲明類成員為靜態(tài)的
當(dāng)我們使用靜態(tài)成員屬性或者函數(shù)時(shí)候 需要使用 域運(yùn)算符 ::
//Instance.h
#ifndef INSTANCE_H
#define INSTANCE_H
class Instance {
public:
static Instance* getInstance();
private:
static Instance *instance;
};
#endif
//Instance.cpp
#include "Instance.h"
Instance* Instance::instance = 0;
Instance* Instance::getInstance() {
//C++11以后逢倍,編譯器保證內(nèi)部靜態(tài)變量的線程安全性
if (!instance) {
instance = new Instance;
}
return instance;
}
重載函數(shù)
C++ 允許在同一作用域中的某個(gè)函數(shù)和運(yùn)算符指定多個(gè)定義,分為函數(shù)重載和運(yùn)算符重載景图。
函數(shù)重載
void print(int i) {
cout << "整數(shù)為: " << i << endl;
}
void print(double f) {
cout << "浮點(diǎn)數(shù)為: " << f << endl;
}
操作符重載
C++允許重定義或重載大部分 C++ 內(nèi)置的運(yùn)算符
函數(shù)名是由關(guān)鍵字 operator 和其后要重載的運(yùn)算符符號(hào)構(gòu)成的
重載運(yùn)算符可被定義為普通的非成員函數(shù)或者被定義為類成員函數(shù)
成員函數(shù)
class Test1 {
public:
Test1(){}
//定義成員函數(shù)進(jìn)行重載
//返回對(duì)象 調(diào)用拷貝構(gòu)造函數(shù) 釋放函數(shù)內(nèi) t 對(duì)象
//引用類型(Test1&) 沒(méi)有復(fù)制對(duì)象 返回的是 t 對(duì)象本身 t會(huì)被釋放 所以會(huì)出現(xiàn)問(wèn)題(數(shù)據(jù)釋放不徹底就不一定)
// 可以輸出 t 與 t3 地址查看
Test1 operator+(const Test1& t1) {
Test1 t;
t.i = this->i + t1.i;
return t;
}
//拷貝構(gòu)造函數(shù) (有默認(rèn)的)
Test1(const Test1& t){
//淺拷貝
this->i = t.i;
cout << "拷貝" << endl;
//如果動(dòng)態(tài)申請(qǐng)內(nèi)存 需要深拷貝
};
int i;
};
Test1 t1;
Test1 t2;
t1.i = 100;
t2.i = 200;
//發(fā)生兩次拷貝
// C++真正的臨時(shí)對(duì)象是不可見(jiàn)的匿名對(duì)象
//1较雕、拷貝構(gòu)造一個(gè)無(wú)名的臨時(shí)對(duì)象,并返回這個(gè)臨時(shí)對(duì)象
//2、由臨時(shí)對(duì)象拷貝構(gòu)造對(duì)象 t3
//語(yǔ)句結(jié)束析構(gòu)臨時(shí)對(duì)象
Test1 t3 = t1 + t2;
cout << t3.i << endl;
Xcode上玩亮蒋,使用的g++編譯器會(huì)進(jìn)行 返回值優(yōu)化(RVO扣典、NRVO) 從而看不到拷貝構(gòu)造函數(shù)的調(diào)用。
可以加入 "-fno-elide-constructors" 取消GNU g++優(yōu)化
<u>對(duì)windows vs編譯器cl.exe無(wú)效慎玖,VS Debug執(zhí)行RVO贮尖,Release執(zhí)行NRVO</u>
RVO(Return Value Optimization):消除函數(shù)返回時(shí)創(chuàng)建的臨時(shí)對(duì)象
NRVO(Named Return Value Optimization):屬于 RVO 的一種技術(shù), 直接將要初始化的對(duì)象替代掉返回的局部對(duì)象進(jìn)行操作。
非成員函數(shù)
class Test2 {
public:
int i;
};
//定義非成員函數(shù)進(jìn)行 + 重載
Test2 operator+(const Test2& t21, const Test2& t22) {
Test2 t;
t.i = t21.i + t22.i;
return t;
}
Test2 t21;
Test2 t22;
t21.i = 100;
t22.i = 200;
Test2 t23 = t21 + t22;
cout << t23.i << endl;
允許重載的運(yùn)算符
void *operator new (size_t size)
{
cout << "新的new:" << size << endl;
return malloc(size);
}
void operator delete(void *p)
{
//釋放由p指向的存儲(chǔ)空間
cout << "新的delete" << endl;
free(p);
}
... ...
繼承
class A:[private/protected/public] B
默認(rèn)為private繼承
A是基類,B稱為子類或者派生類
方式 | 說(shuō)明 |
---|---|
public | 基類的public全肮、protected成員也是派生類相應(yīng)的成員敞咧,基類的private成員不能直接被派生類訪問(wèn),但是可以通過(guò)調(diào)用基類的公有和保護(hù)成員來(lái)訪問(wèn)辜腺。 |
protected | 基類的公有和保護(hù)成員將成為派生類的保護(hù)成員 |
private | 基類的公有和保護(hù)成員將成為派生類的私有成員 |
class Parent {
public:
void test() {
cout << "parent" << endl;
}
};
class Child : Parent {
public:
void test() {
// 調(diào)用父類 方法
Parent::test();
cout << "child" << endl;
}
};
多繼承
一個(gè)子類可以有多個(gè)父類休建,它繼承了多個(gè)父類的特性。
class <派生類名>:<繼承方式1><基類名1>,<繼承方式2><基類名2>,…
多態(tài)
多種形態(tài)评疗。當(dāng)類之間存在層次結(jié)構(gòu)测砂,并且類之間是通過(guò)繼承關(guān)聯(lián)時(shí),就會(huì)用到多態(tài)百匆。
靜態(tài)多態(tài)(靜態(tài)聯(lián)編)是指在編譯期間就可以確定函數(shù)的調(diào)用地址砌些,通過(guò)函數(shù)重載和模版(泛型編程)實(shí)現(xiàn)
動(dòng)態(tài)多態(tài)(動(dòng)態(tài)聯(lián)編)是指函數(shù)調(diào)用的地址不能在編譯器期間確定,必須需要在運(yùn)行時(shí)才確定 ,通過(guò)繼承+虛函數(shù) 實(shí)現(xiàn)
虛函數(shù)
class Parent {
public:
void test() {
cout << "parent" << endl;
}
};
class Child :public Parent {
public:
void test() {
cout << "child" << endl;
}
};
Parent *c = new Child();
// 編譯期間 確定c 為 parent 調(diào)用parent的test方法
c->test();
//修改Parent為virtual 虛函數(shù) 動(dòng)態(tài)鏈接,告訴編譯器不要靜態(tài)鏈接到該函數(shù)
virtual void test() {
cout << "parent" << endl;
}
//動(dòng)態(tài)多態(tài) 調(diào)用Child的test方法
c->test();
構(gòu)造函數(shù)任何時(shí)候都不可以聲明為虛函數(shù)
析構(gòu)函數(shù)一般都是虛函數(shù),釋放先執(zhí)行子類再執(zhí)行父類
純虛函數(shù)
class Parent {
public:
//純虛函數(shù) 繼承自這個(gè)類需要實(shí)現(xiàn) 抽象類型
virtual void test() = 0;
};
class Child :public Parent {
public:
void test(){}
};
模板
模板是泛型編程的基礎(chǔ)
函數(shù)模板
函數(shù)模板能夠用來(lái)創(chuàng)建一個(gè)通用的函數(shù)。以支持多種不同的形參存璃。避免重載函數(shù)的函數(shù)體反復(fù)設(shè)計(jì)仑荐。
template <typename T>
T max(T a,T b)
{
// 函數(shù)的主體
return a > b ? a : b;
}
//代替了
int max(int a,int b)
int max(float a,float b)
類模板(泛型類)
為類定義一種模式。使得類中的某些數(shù)據(jù)成員纵东、默寫成員函數(shù)的參數(shù)粘招、某些成員函數(shù)的返回值,能夠取隨意類型
常見(jiàn)的 容器比如 向量 vector <int> 或 vector <string> 就是模板類
template<class E,class T>
class Queue {
public:
T add(E e,T t){
return e+t;
}
};
Queue<int,float> q;
q.add(1,1.1f) = 2.1f