C++基础17-纯虚函数和抽象类
生活随笔
收集整理的這篇文章主要介紹了
C++基础17-纯虚函数和抽象类
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
總結:
1,含有純虛函數的類,稱為抽象基類,不可實列化。即不能創建對象,存在 的意義就是被繼承,提供族類的公共接口。
2,純虛函數只有聲明,沒有實現,被“初始化”為 0。
3,如果一個類中聲明了純虛函數,而在派生類中沒有對該函數定義,則該虛函數在派生類中仍然為純虛函數,派生類仍然為純虛基類。
1、基本概念
純虛函數是一個在基類中說明的虛函數,在基類中沒有定義,要求任何派生類都定義自己的版本
??? 純虛函數為個派生類提供一個公共界面(接口的封裝和設計、軟件的模塊功能劃分)
2、純虛函數的語法
??????? virtual 類型 函數名(參數表) = 0;
一個具有純虛函數的基類稱為抽象類。
3、C++中沒有接口的概念,C++中可以使用純虛函數實現接口
????? 接口類中只有函數原型定義,沒有任何數據的定義.
代碼示例:
01純虛函數:
?
02抽象類練習:
#if 1 #include<iostream> using namespace std; class Boss { public:virtual void fight() = 0; }; class DongFangBuBai :public Boss { public:virtual void fight() {cout << "東方不敗使出了葵花寶典" << endl;} }; class DuanYu :public Boss { public:virtual void fight() {cout << "段譽使出了六脈神劍" << endl;} }; class WuYaZi :public Boss { public:virtual void fight() {cout << "無崖子使出了北冥神功" << endl;} }; void test01() {Boss *Dong = new DongFangBuBai;Dong->fight();Boss *Duan = new DuanYu;Duan->fight();Boss *Wu = new WuYaZi;Wu->fight();delete Dong;delete Duan;delete Wu; } /* 東方不敗使出了葵花寶典 段譽使出了六脈神劍 無崖子使出了北冥神功 */ int main() {test01();return 0; } #endif03純虛函數和多繼承練習:
#if 1 #include<iostream> using namespace std; class Interface1 { public:virtual void func1(int a, int b) = 0; }; class Interface2 { public:virtual void func2(int a) = 0; }; class Child :public Interface1, public Interface2 { public:virtual void func1(int a, int b) {cout << "func1" << endl;}virtual void func2(int a) {cout << "func2" << endl;} }; void test01() {Child d;Interface1 *if1 = new Child;if1->func1(1,2); //只能看見func1,看不見func2 } /* func1 */ int main() {test01();return 0; } #endif抽象類練習2:
Animal1.h
#pragma once #include<iostream> using namespace std; class Animal1 { public:virtual void voice() = 0;Animal1();virtual ~Animal1();};//架構函數 //讓動物叫 void letAnimalCry(Animal1 *animal); void letAnimalCrys(Animal1 *animal);Animal1.cpp
#include "Animal1.h"Animal1::Animal1() {cout << "Animal1()" << endl; }Animal1::~Animal1() {cout << "~Animal1()" << endl; }void letAnimalCrys(Animal1 * animal) {animal->voice();delete animal; //這里刪除,調用時不必刪除 } void letAnimalCry(Animal1 *animal) {animal->voice(); }Cat1.h
#pragma once #include "Animal1.h" class Cat1 :public Animal1 { public:Cat1();~Cat1();virtual void voice(); };Cat1.cpp
#include "Cat1.h" Cat1::Cat1() {cout << "Cat1()" << endl; }Cat1::~Cat1() {cout << "~Cat1()" << endl; } void Cat1::voice() {cout << "cat is crying" << endl; }Dog1.h
#pragma once #include "Animal1.h" class Dog1 :public Animal1 { public:Dog1();~Dog1();virtual void voice(); };Dog1.cpp
#include "Dog1.h" Dog1::Dog1() {cout << "Dog1()" << endl; }Dog1::~Dog1() {cout << "~Dog()" << endl; } void Dog1::voice() {cout << "dog is crying" << endl; }main.cpp
#include"Animal1.h" #include"Dog1.h" #include"Cat1.h"void test01() {Animal1 *dog = new Dog1;dog->voice();delete dog; //如果Animal的析構函數沒有聲明為虛函數,運行delete不會調用子類析構函數如果Animal的析構函數聲明為虛函數,運行delete會調用子類析構函數Animal1 *cat = new Cat1;cat->voice();delete cat; } /* Animal1() Dog1() dog is crying ~Dog() ~Animal1() Animal1() Cat1() cat is crying ~Cat1() ~Animal1() */ void test02() {Animal1 *dog = new Dog1;Animal1 *cat = new Cat1;letAnimalCry(dog);letAnimalCry(cat);delete dog; //架構函數中未執行刪除對象操作 調用時執行刪除操作delete cat; } /* Animal1() Dog1() Animal1() Cat1() dog is crying cat is crying ~Dog() ~Animal1() ~Cat1() ~Animal1() */ void test03() {Animal1 *dog = new Dog1;Animal1 *cat = new Cat1;letAnimalCrys(dog);//架構函數中執行刪除對象操作 調用時不需要執行letAnimalCrys(cat);} /* Animal1() Dog1() Animal1() Cat1() dog is crying ~Dog() ~Animal1() cat is crying ~Cat1() ~Animal1() */ //test03 等價于 test04 void test04() {letAnimalCrys(new Dog1);letAnimalCrys(new Cat1); } /* Animal1() Dog1() dog is crying ~Dog() ~Animal1() Animal1() Cat1() cat is crying ~Cat1() ~Animal1() */ int main() {//test01();cout << "-------"<<endl;//test02();cout << "-------" << endl;//test03();cout << "-------" << endl;//test04();return 0;}?
總結
以上是生活随笔為你收集整理的C++基础17-纯虚函数和抽象类的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 爬虫5-BeautifulSoup模块简
- 下一篇: C++基础05-类构造函数与析构函数