日本免费精品_最新日韩一区_亚洲视频一区在线_a在线视频观看_天天射夜夜骑_粉嫩av一区二区三区_欧美中日韩免费视频_综合图区欧美_国内精品美女在线观看_午夜精品久久久久久久男人的天堂

首頁 > 編程 > C++ > 正文

解析C++編程中virtual聲明的虛函數(shù)以及單個(gè)繼承

2020-05-23 14:09:31
字體:
供稿:網(wǎng)友
這篇文章主要介紹了C++編程中virtual聲明的虛函數(shù)以及單個(gè)繼承,剖析虛函數(shù)和單個(gè)基類所能夠繼承的成員,要的朋友可以參考下
 

虛函數(shù)

虛函數(shù)是應(yīng)在派生類中重新定義的成員函數(shù)。 當(dāng)使用指針或?qū)惖囊脕硪门缮念悓?duì)象時(shí),可以為該對(duì)象調(diào)用虛函數(shù)并執(zhí)行該函數(shù)的派生類版本。
虛函數(shù)確保為該對(duì)象調(diào)用正確的函數(shù),這與用于進(jìn)行函數(shù)調(diào)用的表達(dá)式無關(guān)。
假定基類包含聲明為 virtual 的函數(shù),并且派生類定義了相同的函數(shù)。 為派生類的對(duì)象調(diào)用派生類中的函數(shù),即使它是使用指針或?qū)惖囊脕碚{(diào)用的。 以下示例顯示了一個(gè)基類,它提供了 PrintBalance 函數(shù)和兩個(gè)派生類的實(shí)現(xiàn)

// deriv_VirtualFunctions.cpp// compile with: /EHsc#include <iostream>using namespace std;class Account {public:  Account( double d ) { _balance = d; }  virtual double GetBalance() { return _balance; }  virtual void PrintBalance() { cerr << "Error. Balance not available for base type." << endl; }private:  double _balance;};class CheckingAccount : public Account {public:  CheckingAccount(double d) : Account(d) {}  void PrintBalance() { cout << "Checking account balance: " << GetBalance() << endl; }};class SavingsAccount : public Account {public:  SavingsAccount(double d) : Account(d) {}  void PrintBalance() { cout << "Savings account balance: " << GetBalance(); }};int main() {  // Create objects of type CheckingAccount and SavingsAccount.  CheckingAccount *pChecking = new CheckingAccount( 100.00 ) ;  SavingsAccount *pSavings = new SavingsAccount( 1000.00 );  // Call PrintBalance using a pointer to Account.  Account *pAccount = pChecking;  pAccount->PrintBalance();  // Call PrintBalance using a pointer to Account.  pAccount = pSavings;  pAccount->PrintBalance();  }

在前面的代碼中,對(duì) PrintBalance 的調(diào)用是相同的,pAccount 所指向的對(duì)象除外。 由于 PrintBalance 是虛擬的,因此將調(diào)用為每個(gè)對(duì)象定義的函數(shù)版本。 派生類 PrintBalance 和 CheckingAccount 中的 SavingsAccount 函數(shù)“重寫”基類 Account 中的函數(shù)。
如果聲明的類不提供 PrintBalance 函數(shù)的重寫實(shí)現(xiàn),則使用基類 Account 中的默認(rèn)實(shí)現(xiàn)。
派生類中的函數(shù)僅在基類中的虛函數(shù)的類型相同時(shí)重寫這些虛函數(shù)。 派生類中的函數(shù)不能只是與其返回類型中的基類的虛函數(shù)不同;參數(shù)列表也必須不同。
當(dāng)使用指針或引用調(diào)用函數(shù)時(shí),以下規(guī)則將適用:
根據(jù)為其調(diào)用的對(duì)象的基本類型來解析對(duì)虛函數(shù)的調(diào)用。
根據(jù)指針或引用的類型來解析對(duì)非虛函數(shù)的調(diào)用。
以下示例說明在通過指針調(diào)用時(shí)虛函數(shù)和非虛函數(shù)的行為:

// deriv_VirtualFunctions2.cpp// compile with: /EHsc#include <iostream>using namespace std;class Base {public:  virtual void NameOf();  // Virtual function.  void InvokingClass();  // Nonvirtual function.};// Implement the two functions.void Base::NameOf() {  cout << "Base::NameOf/n";}void Base::InvokingClass() {  cout << "Invoked by Base/n";}class Derived : public Base {public:  void NameOf();  // Virtual function.  void InvokingClass();  // Nonvirtual function.};// Implement the two functions.void Derived::NameOf() {  cout << "Derived::NameOf/n";}void Derived::InvokingClass() {  cout << "Invoked by Derived/n";}int main() {  // Declare an object of type Derived.  Derived aDerived;  // Declare two pointers, one of type Derived * and the other  // of type Base *, and initialize them to point to aDerived.  Derived *pDerived = &aDerived;  Base  *pBase  = &aDerived;  // Call the functions.  pBase->NameOf();      // Call virtual function.  pBase->InvokingClass();  // Call nonvirtual function.  pDerived->NameOf();    // Call virtual function.  pDerived->InvokingClass(); // Call nonvirtual function.}

輸出

Derived::NameOfInvoked by BaseDerived::NameOfInvoked by Derived

請(qǐng)注意,無論 NameOf 函數(shù)是通過指向 Base 的指針還是通過指向 Derived 的指針進(jìn)行調(diào)用,它都會(huì)調(diào)用 Derived 的函數(shù)。 它調(diào)用 Derived 的函數(shù),因?yàn)?NameOf 是虛函數(shù),并且 pBase 和 pDerived 都指向類型 Derived 的對(duì)象。
由于僅為類類型的對(duì)象調(diào)用虛函數(shù),因此不能將全局函數(shù)或靜態(tài)函數(shù)聲明為 virtual。
在派生類中聲明重寫函數(shù)時(shí)可使用 virtual 關(guān)鍵字,但它不是必需的;虛函數(shù)的重寫始終是虛擬的。
必須定義基類中的虛函數(shù),除非使用 pure-specifier 聲明它們。 (有關(guān)純虛函數(shù)的詳細(xì)信息,請(qǐng)參閱抽象類。)
可通過使用范圍解析運(yùn)算符 (::) 顯式限定函數(shù)名稱來禁用虛函數(shù)調(diào)用機(jī)制。 考慮先前涉及 Account 類的示例。 若要調(diào)用基類中的 PrintBalance,請(qǐng)使用如下所示的代碼:

CheckingAccount *pChecking = new CheckingAccount( 100.00 );pChecking->Account::PrintBalance(); // Explicit qualification.Account *pAccount = pChecking; // Call Account::PrintBalancepAccount->Account::PrintBalance();  // Explicit qualification.

在前面的示例中,對(duì) PrintBalance 的調(diào)用將禁用虛函數(shù)調(diào)用機(jī)制。


單個(gè)繼承
在“單繼承”(繼承的常見形式)中,類僅具有一個(gè)基類。考慮下圖中闡釋的關(guān)系。

解析C++編程中virtual聲明的虛函數(shù)以及單個(gè)繼承

簡(jiǎn)單單繼承關(guān)系圖
注意該圖中從常規(guī)到特定的進(jìn)度。在大多數(shù)類層次結(jié)構(gòu)的設(shè)計(jì)中發(fā)現(xiàn)的另一個(gè)常見特性是,派生類與基類具有“某種”關(guān)系。在該圖中,Book 是一種 PrintedDocument,而 PaperbackBook 是一種 book。
該圖中的另一個(gè)要注意的是:Book 既是派生類(來自 PrintedDocument),又是基類(PaperbackBook 派生自 Book)。此類類層次結(jié)構(gòu)的框架聲明如下面的示例所示:

// deriv_SingleInheritance.cpp// compile with: /LDclass PrintedDocument {};// Book is derived from PrintedDocument.class Book : public PrintedDocument {};// PaperbackBook is derived from Book.class PaperbackBook : public Book {};

PrintedDocument 被視為 Book 的“直接基”類;它是 PaperbackBook 的“間接基”類。差異在于,直接基類出現(xiàn)在類聲明的基礎(chǔ)列表中,而間接基類不是這樣的。
在聲明派生的類之前聲明從中派生每個(gè)類的基類。為基類提供前向引用聲明是不夠的;它必須是一個(gè)完整聲明。
在前面的示例中,使用訪問說明符 public。 成員訪問控制中介紹了公共的、受保護(hù)的和私有的繼承的含義。
類可用作多個(gè)特定類的基類,如下圖所示。

解析C++編程中virtual聲明的虛函數(shù)以及單個(gè)繼承

注意
有向非循環(huán)圖對(duì)于單繼承不是唯一的。它們還用于表示多重繼承關(guān)系圖。 多重繼承中對(duì)本主題進(jìn)行了說明。
在繼承中,派生類包含基類的成員以及您添加的所有新成員。因此,派生類可以引用基類的成員(除非在派生類中重新定義這些成員)。當(dāng)在派生類中重新定義了直接或間接基類的成員時(shí),范圍解析運(yùn)算符 (::) 可用于引用這些成員。請(qǐng)看以下示例:

// deriv_SingleInheritance2.cpp// compile with: /EHsc /c#include <iostream>using namespace std;class Document {public:  char *Name;  // Document name.  void PrintNameOf();  // Print name.};// Implementation of PrintNameOf function from class Document.void Document::PrintNameOf() {  cout << Name << endl;}class Book : public Document {public:  Book( char *name, long pagecount );private:  long PageCount;};// Constructor from class Book.Book::Book( char *name, long pagecount ) {  Name = new char[ strlen( name ) + 1 ];  strcpy_s( Name, strlen(Name), name );  PageCount = pagecount;};

請(qǐng)注意,Book 的構(gòu)造函數(shù) (Book::Book) 具有對(duì)數(shù)據(jù)成員 Name 的訪問權(quán)。在程序中,可以創(chuàng)建和使用類型為 Book 的對(duì)象,如下所示:

// Create a new object of type Book. This invokes the//  constructor Book::Book.Book LibraryBook( "Programming Windows, 2nd Ed", 944 );...// Use PrintNameOf function inherited from class Document.LibraryBook.PrintNameOf();

如前面的示例所示,以相同的方式使用類成員和繼承的數(shù)據(jù)和函數(shù)。如果類 Book 的實(shí)現(xiàn)調(diào)用 PrintNameOf 函數(shù)的重新實(shí)現(xiàn),則只能通過使用范圍解析 (Document) 運(yùn)算符來調(diào)用屬于 :: 類的函數(shù):

// deriv_SingleInheritance3.cpp// compile with: /EHsc /LD#include <iostream>using namespace std;class Document {public:  char *Name;     // Document name.  void PrintNameOf() {} // Print name.};class Book : public Document {  Book( char *name, long pagecount );  void PrintNameOf();  long PageCount;};void Book::PrintNameOf() {  cout << "Name of book: ";  Document::PrintNameOf();}

如果存在可訪問的明確基類,則可以隱式將派生類的指針和引用轉(zhuǎn)換為其基類的指針和引用。下面的代碼使用指針演示了此概念(相同的原則適用于引用):

// deriv_SingleInheritance4.cpp// compile with: /W3struct Document {  char *Name;  void PrintNameOf() {}};class PaperbackBook : public Document {};int main() {  Document * DocLib[10];  // Library of ten documents.  for (int i = 0 ; i < 10 ; i++)   DocLib[i] = new Document;}

在前面的示例中,創(chuàng)建了不同的類型。但是,由于這些類型都派生自 Document 類,因此存在對(duì) Document * 的隱式轉(zhuǎn)換。因此,DocLib 是“異類列表”(其中包含的所有對(duì)象并非屬于同一類型),該列表包含不同類型的對(duì)象。
由于 Document 類具有一個(gè) PrintNameOf 函數(shù),因此它可以打印庫中每本書的名稱,但它可能會(huì)忽略某些特定于文檔類型的信息(Book 的頁計(jì)數(shù)、HelpFile 的字節(jié)數(shù)等)。
注意
強(qiáng)制使用基類來實(shí)現(xiàn)函數(shù)(如 PrintNameOf)通常不是最佳設(shè)計(jì)。 虛函數(shù)提供其他設(shè)計(jì)替代方法。



發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
中文字幕综合在线| 最近免费中文字幕在线第一页| 在线欧美日韩精品| 国产在线欧美| 精品乱人伦一区二区三区| 中文字幕视频在线免费欧美日韩综合在线看| 日本黄色一区二区| 国产欧美久久久精品免费| 欧美综合精品| 中文不卡在线| 国产嫩草影院久久久久| 黄污视频在线看| 亚洲免费婷婷| 91久久中文| 91久久精品在线| 欧美日韩国产页| 欧美日韩国产亚洲一区| www.91香蕉视频| 久久视频免费看| 国产不卡一区| 一区二区三区在线不卡| 日韩色在线观看| 欧美日韩亚洲国产综合| 亚洲一级网站| 最新中文字幕在线播放| 欧美日韩人人澡狠狠躁视频| 欧美高清视频一区二区三区| 精品综合久久久久| 91精品国产综合久久久久久| 欧美国产亚洲一区| 国产成人精品三级| www在线播放| 日韩视频一区二区在线观看| 国产一级网站视频在线| 午夜精品免费视频| 国产一卡2卡3卡免费网站| 成人xxxx| 国产调教精品| 欧美日韩国产91| 久久99精品国产| 在线视频不卡国产V| 日韩在线视频在线观看| 欧美日韩人人澡狠狠躁视频| 欧美三级日本三级少妇99| 欧美日韩亚洲天堂| 国产婷婷精品| 日韩精品视频在线看| 日韩中文字幕视频在线观看| 日韩在线二区| 国产在线观看色| 97久久精品| 中文字幕视频在线免费欧美日韩综合在线看 | 日韩欧美国产成人精品免费| 日韩av二区| 久久精品国产99| 中文字幕乱码在线| 91精品国产自产观看在线| 韩国v欧美v日本v亚洲| 国产视频一二区| 日韩中文字幕网| 国产在线精品国自产拍免费| 久久精品黄色片| 快she精品国产999| 中文字幕在线精品| 欧美日韩激情一区二区三区| 一区视频在线播放| 国产欧美日韩亚洲| 国产激情在线| 精品久久久91| 欧洲一级精品| a视频免费在线观看| 欧美亚洲综合视频| 一区二区三区在线免费| 二区视频在线观看| 日韩中文字幕视频在线观看| 天堂在线www天堂中文在线| 日韩精品视频中文在线观看| 国产久卡久卡久卡久卡视频精品 | 视频一区视频二区中文| 国产无套粉嫩白浆在线2022年| 国产在线二区| 国产色在线视频| 亚洲午夜91| 深夜福利一区| 国产字幕中文| 国产三级精品在线观看| 日韩在线 中文字幕| 亚洲精品中文字幕乱码三区| 亚洲欧美中文在线视频| 国产在线一在线二| 国产一区精品在线| 婷婷久久综合网| 欧美亚洲国产免费| 日韩.欧美.亚洲| 中文字幕日韩欧美在线| 国产真实乱子伦精品视频| 最近免费中文字幕在线第一页| 日韩欧美亚洲区| 日本一级一片免费视频| 91精品国产自产在线丝袜啪| 午夜伦欧美伦电影理论片| 精品视频资源站| 国产在线一区二区视频| 在线观看国产福利视频| 午夜av一区| 亚洲电影中文字幕在线观看| 欧美日韩中文字幕在线| 欧美在线视频一区二区| 在线观看国产一级片| 久久久水蜜桃| 国产在线精品日韩| 国产蜜臀在线| 国产区日韩欧美| 99pao成人国产永久免费视频| 91精品免费在线观看| 久久精品女人| 精品福利一区二区三区| 日韩免费高清一区二区| 不卡福利视频| 亚洲一区在线观看视频| 精品久久电影| 久久久99久久| 欧美午夜精品在线| 又黄又www的网站| 日韩精品在线私人| 欧美日韩视频不卡| 亚洲经典中文字幕| 亚洲素人一区二区| 欧美高清视频一区二区三区| 精品亚洲成a人片在线观看| 欧美二三四区| 中文字幕在线亚洲| 日韩欧美一级精品久久| 欧美日韩精品在线播放| 日韩欧美国产成人一区二区| 中文字幕中文字幕精品| 日韩一级免费视频| 激情综合色综合久久| 欧美日韩高清不卡| 国产乱国产乱300精品| 97最新国自产拍视频在线完整在线看| av首页在线| 国产在线拍揄自揄拍| 日韩精品视频在线播放| 日韩精品在线免费观看视频| 欧美天堂一区二区| 欧美日韩在线视频一区| 欧美日韩视频免费播放| 成人无遮挡免费网站视频在线观看 | 欧美日韩国产免费观看| 中文字幕视频在线免费欧美日韩综合在线看| 欧美不卡123| 亚洲 欧美 中文字幕| 91欧美在线| 一区二区三区免费看视频 | 中文字幕在线观看国产| 亚洲日本欧美日韩高观看| 在线一区免费| 国产绿帽一区二区三区| 中文天堂在线一区| 日韩免费电影网站| www.老鸭窝.com| 国产aa精品| 91久久久精品国产| 在线视频不卡一区二区| 日本精品国语自产拍在线观看| 激情久久99| 国产区在线看| 国产日产一区二区三区 | 国产成人精品三级| wwwww亚洲| 欧美日韩一二| 久久99精品久久久久久青青日本| 国产高清在线一区| 美女在线视频一区| 国产欧美久久久精品免费| 91精品电影| 精品国产乱码久久久久久蜜臀| 日韩国产在线不卡视频| 国产在线导航| 97国产视频| 亚洲开心激情| 99pao成人国产永久免费视频| 欧美1234区| 亚洲专区一二三| 91一区二区| 日韩国产成人| 日韩在线a电影| 欧美日韩综合在线| 日韩欧美一级二级三级久久久| 久久蜜桃精品| 日韩国产一区久久| 美女在线视频一区| 亚洲素人一区二区| 视频一区不卡| 日韩免费看网站| 亚洲乱码中文字幕综合| 亚洲午夜91| 在线观看中文字幕一区| 欧美,日韩,国产在线| 日韩欧美一级在线播放| 亚洲一区日韩精品中文字幕| 亚洲国产欧美久久| 久久精品99久久久久久久久| 欧美日韩综合在线| 亚洲福利精品在线| 中文字幕4区| 日韩精品视频免费| 国产在线观看黄色| 91精品视频在线| 亚洲一区在线观看免费| 中文字幕在线视频网| 一级片免费在线| 99pao成人国产永久免费视频| 区日韩二区欧美三区| 91精品国产高清| 亚洲国产无线乱码在线观看| 日韩欧美中文字幕视频| av免费观看国产| 日韩精品―中文字幕| 日韩精品在线视频观看| 婷婷精品进入| 欧美日韩中文字幕| 日韩精品视频免费播放| 日韩精品视频在线播放| 国产中文在线| 天堂√8在线中文| 亚洲第一网中文字幕| 精品久久久视频| 亚洲成年人在线播放| 日韩欧美在线中文字幕| 国产在线www| 日韩欧美在线网站| 久久夜色精品国产欧美乱极品| 黄色一区二区在线观看| 久久99蜜桃精品| 欧美在线视频第一页| 精品久久在线| 欧美日韩在线观看首页| 国产在线日韩欧美| 国产成人一二三区| 日韩在线观看a| 欧美日韩亚洲国产综合| 日韩欧美看国产| 亚洲欧美视频一区二区三区| 久久69成人| 亚洲欧洲三级| 日韩在线视频网| 国产午夜精品视频| 欧美日韩国产999| 国产高清视频一区二区| 丰满少妇一区| 欧美日韩国产免费观看视频| 亚洲.国产.中文慕字在线| 91麻豆精品在线| 亚洲综合日韩中文字幕v在线| 日韩免费电影网站| 日韩精品国产欧美| 91精品日本| 国产视频一区二| 激情婷婷亚洲| 国产在线不卡一区| 一本一道综合狠狠老| 日韩精品视频在线| 中文字幕日韩视频| 国产黄色小视频| 欧美日韩中文字幕视频| 久久久99精品久久| 国产丝袜一区| 欧美一级二级三级区| 欧美日韩中文字幕在线| 日韩一二三四区| 国产一卡2卡3卡免费网站| 成人a在线观看| 午夜亚洲一区| eeuss一区| 精品一区二区三区中文字幕| 欧美日韩国产中文精品字幕自在自线| 91麻豆精品国产91久久久使用方法 | 国产成人精品亚洲| 日韩一级免费视频| 欧美91精品| 中文精品在线| 欧美在线日韩| 91精品999| 欧美日韩在线播放三区四区| 欧美日韩精品免费看| 日本а中文在线天堂| 91久久久久久久久| 国产嫩草影院久久久久| 九九精品调教| 亚洲精品欧美二区三区中文字幕 | 亚洲一区在线观看视频| 亚洲一区资源| 国产视频二区| 国产一级视频在线播放| www.eeuss影院| 日韩精品―中文字幕| 日韩视频一区在线观看| 日韩欧美中文第一页| 国产福利在线播放| 一区二区三区精品久久久| 婷婷中文字幕综合| 欧美日韩综合在线| 日韩中文字幕第一页| 国产欧美日韩不卡| 亚洲黄色www| 91精品国产免费| 999精品在线| 91精品在线观看国产| 国产乱国产乱老熟300| 日韩视频精品在线| 国产最新在线| 日韩在线中文字幕| 深夜福利亚洲| 美女免费视频一区| 最近中文字幕在线中文视频| 欧美日韩中文字幕在线视频| 人成在线免费视频| 国产无遮挡在线视频免费观看| 黄色片免费看| 日本不卡免费高清视频| 国产网站av| 色一区在线观看| 日韩中文首页| 一级一片免费视频| 国产一区成人| 国产视频1区2区| 日韩wumaV| 欧美日韩亚州综合| 欧美日韩第一| 久久久精品午夜少妇| 一级片在线播放| 国产日韩免费| 国产视频1区2区| 日韩欧美中文在线| 日韩欧美一卡二卡| 国产精品一区二三区| 国产999在线观看| 亚洲第一精品在线| 欧美三级在线播放| 亚洲高清中文字幕| 中文字幕久久av| 亚洲国产欧美日韩精品| 中文字幕五月欧美| 久久视频免费看| 在线免费91| 日韩精品视频在线观看免费| 欧美色视频一区二区三区在线观看| 韩日中文字幕第一页| 99精品电影| 国产日韩精品在线| 久久精品电影| 亚洲美女视频一区| 精品人妻一区二区免费视频| 欧美日韩亚洲91| 日韩欧美中文免费| 日韩久久在线| 91精品国产色综合久久久蜜香臀| 中文字幕在线视频精品| 亚洲三级免费看| 国产欧美 在线欧美| 国产欧美日韩精品在线| 国产一区日韩| 亚洲伊人婷婷| 天天综合天天做| 午夜成人鲁丝片午夜精品| 国产欧美日韩综合| 精品视频久久| 精品1区2区3区| 亚洲成av人片一区二区密柚| 国产在成人精品线拍偷自揄拍 | 日韩不卡中文字幕| 国产久卡久卡久卡久卡视频精品| 久久精品日韩欧美| 精品视频—区二区三区免费| 精品视频123区在线观看| 欧美乱大交xxxxx免费| 日韩视频一区| 美日韩精品免费视频| www.狠狠| 高清不卡一区二区| 中文字幕欧美国内| 免费精品国产自产拍观看| 日韩1区在线| 国产一二三精品| 国产欧美日韩91| 一区二区日韩视频| 欧美日韩中文在线| 亚洲第一香蕉网| 一区二区三区精品久久久| 日韩欧美三级视频| 亚洲欧美中文字幕在线观看| 日本黄色一区二区三区| 国产乱一区二区| 日韩欧美999| 91精品国产综合久久香蕉最新版| 欧美久久在线| 日韩欧美资源站| 中文字幕亚洲字幕|