最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++ Virtual關(guān)鍵字的具體使用

 更新時間:2020年11月01日 11:11:19   作者:送外賣轉(zhuǎn)行計算機  
這篇文章主要介紹了C++ Virtual關(guān)鍵字的具體使用,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

基礎(chǔ)理解和demo

普通的繼承

#include<iostream>

class Parent {
public:
  void print() {
    std::cout << "Parent" << std::endl;
  }
};

class Child : Parent {
public:
  void print() {
    std::cout << "Child" << std::endl;
  }
};

int main() {
  Child c;
  c.print();
  return 0;
}

輸出結(jié)果為 "Child"

但是如果是 "父類的指針指向子類的對象" 這種情況下, 使用這個父類的指針去調(diào)用被重寫的方法呢, 結(jié)果會是什么呢? 從語法的本質(zhì)上講, 子類對象的內(nèi)存前半部分就是父類, 因為可以將子類對象的指針直接轉(zhuǎn)化為父類。

#include<iostream>

class Parent {
public:
  void print() {
    std::cout << "Parent" << std::endl;
  }
};

// 注意這里必須是 public Parent
// 不然會報錯 cannot cast 'Child' to its private base class 'Parent'
class Child : public Parent {
public:
  void print() {
    std::cout << "Child" << std::endl;
  }
};

int main() {
  Parent* p = new Child();
  p->print();
  return 0;
}

這個時候輸出的是 "Parent"  。

所以, 當(dāng)一個成員函數(shù)需要被子類重寫, 那么必須將其聲明為virtual, 也就是 虛函數(shù) , 注意, 子類覆寫的方法的virtual關(guān)鍵字會自動繼承而來, 可以顯示地寫或者不寫(建議還是寫上)。

這樣修改完就沒問題了:

#include<iostream>

class Parent {
public:
  virtual void print() {
    std::cout << "Parent" << std::endl;
  }
};

class Child : public Parent {
public:
  virtual void print() {
    std::cout << "Child" << std::endl;
  }
};

int main() {
  Parent* p = new Child();
  p->print();
  return 0;
}

加深理解

Virtual 關(guān)鍵字的一個重要概念 "只有在通過基類指針或引用間接指向派生類子類型時多態(tài)性才會起作用" , 也就是說, 基類的函數(shù)調(diào)用如果有virtual則根據(jù)多態(tài)性調(diào)用派生類的,如果沒有virtual則是正常的靜態(tài)函數(shù)調(diào)用,還是調(diào)用基類的。

舉個例子

#include <iostream.h>
class Base
{
public:
virtual void f(float x){ cout << "Base::f(float) " << x << endl; }
void g(float x){ cout << "Base::g(float) " << x << endl; }
void h(float x){ cout << "Base::h(float) " << x << endl; }
};
 
class Derived : public Base
{
public:
virtual void f(float x){ cout << "Derived::f(float) " << x << endl; }
void g(int x){ cout << "Derived::g(int) " << x << endl; }
void h(float x){ cout << "Derived::h(float) " << x << endl; }
};
 
void main(void)
{
Derived d;
Base *pb = &d;
Derived *pd = &d;
// Good : behavior depends solely on type of the object
pb->f(3.14f); // Derived::f(float) 3.14
pd->f(3.14f); // Derived::f(float) 3.14
// Bad : behavior depends on type of the pointer
pb->g(3.14f); // Base::g(float) 3.14
pd->g(3.14f); // Derived::g(int) 3 (surprise!)
// Bad : behavior depends on type of the pointer
pb->h(3.14f); // Base::h(float) 3.14 (surprise!)
pd->h(3.14f); // Derived::h(float) 3.14
}

粘貼這個博客的一段話, 表達的就是這個意思:

bp 和dp 指向同一地址,按理說運行結(jié)果應(yīng)該是相同的,而事實上運行結(jié)果不同,所以他把原因歸結(jié)為C++的隱藏規(guī)則,其實這一觀點是錯的。決定bp和dp調(diào)用函數(shù)運行結(jié)果的不是他們指向的地址,而是他們的指針類型。 “只有在通過基類指針或引用間接指向派生類子類型時多態(tài)性才會起作用”(C++ Primer 3rd Edition)。pb是基類指針,pd是派生類指針,pd的所有函數(shù)調(diào)用都只是調(diào)用自己的函數(shù),和多態(tài)性無關(guān),所以pd的所有函數(shù)調(diào)用的結(jié)果都輸出Derived::是完全正常的;pb的函數(shù)調(diào)用如果有virtual則根據(jù)多態(tài)性調(diào)用派生類的,如果沒有virtual則是正常的靜態(tài)函數(shù)調(diào)用,還是調(diào)用基類的,所以有virtual的f函數(shù)調(diào)用輸出Derived::,其它兩個沒有virtual則還是輸出Base::很正常啊 ,nothing surprise! 所以并沒有所謂的隱藏規(guī)則,雖然《高質(zhì)量C++/C 編程指南》是本很不錯的書,可大家不要迷信哦。記住“只有在通過基類指針或引用間接指向派生類子類型時多態(tài)性才會起作用”。

到此這篇關(guān)于C++ Virtual關(guān)鍵字的具體使用的文章就介紹到這了,更多相關(guān)C++ Virtual關(guān)鍵字內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • CMakeList中自動編譯protobuf文件過程

    CMakeList中自動編譯protobuf文件過程

    這篇文章主要介紹了CMakeList中自動編譯protobuf文件過程,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • C++實現(xiàn)LeetCode(138.拷貝帶有隨機指針的鏈表)

    C++實現(xiàn)LeetCode(138.拷貝帶有隨機指針的鏈表)

    這篇文章主要介紹了C++實現(xiàn)LeetCode(138.拷貝帶有隨機指針的鏈表),本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • C語言中不定參數(shù)?...?的語法以及函數(shù)封裝

    C語言中不定參數(shù)?...?的語法以及函數(shù)封裝

    不定參數(shù)是指函數(shù)可以接收不確定個數(shù)的參數(shù),下面這篇文章主要給大家介紹了關(guān)于C語言中不定參數(shù)?...?的語法以及函數(shù)封裝的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2023-01-01
  • c++實現(xiàn)獲取當(dāng)前時間(精確至秒,毫秒和微妙)

    c++實現(xiàn)獲取當(dāng)前時間(精確至秒,毫秒和微妙)

    這篇文章主要為大家詳細介紹了c++實現(xiàn)獲取當(dāng)前時間(可以精確至秒,毫秒和微妙)的相關(guān)知識,文中的示例代碼講解詳細,感興趣的小伙伴可以參考一下
    2023-11-11
  • 教你用C語言實現(xiàn)三子棋

    教你用C語言實現(xiàn)三子棋

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)簡單三子棋程序,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • C++?點(.)和箭頭(->)運算符用法小結(jié)

    C++?點(.)和箭頭(->)運算符用法小結(jié)

    在C++中,點運算符(.)用于訪問類的成員變量和成員函數(shù),而箭頭運算符(->)用于通過指針訪問類的成員變量和成員函數(shù),本文就來詳細的介紹一下如何使用,感興趣的可以了解一下
    2024-01-01
  • C/C++堆區(qū)專篇精講

    C/C++堆區(qū)專篇精講

    一直以來總是對這個問題的認識比較朦朧,我相信很多朋友也是這樣的,總是聽到內(nèi)存一會在棧上分配,一會又在堆上分配,那么它們之間到底是怎么的區(qū)別呢,讓我們一起來看看
    2022-10-10
  • C語言實現(xiàn)萬年歷小功能

    C語言實現(xiàn)萬年歷小功能

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)萬年歷小功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-03-03
  • C++ 中 const和static readonly區(qū)別

    C++ 中 const和static readonly區(qū)別

    這篇文章主要介紹了C++ 中 const和static readonly區(qū)別的相關(guān)資料,需要的朋友可以參考下
    2017-05-05
  • C++?反匯編之關(guān)于Switch語句的優(yōu)化措施

    C++?反匯編之關(guān)于Switch語句的優(yōu)化措施

    這篇文章主要介紹了C++?反匯編之關(guān)于Switch語句的優(yōu)化措施,利用三種優(yōu)化來降低樹高度,誰的效率高就優(yōu)先使用誰,三種優(yōu)化都無法匹配才會使用判定樹,具體內(nèi)容詳情跟隨小編一起看看吧
    2022-01-01

最新評論

兰西县| 七台河市| 卓尼县| 株洲市| 成安县| 三明市| 北辰区| 伽师县| 久治县| 马山县| 宁德市| 富平县| 秦安县| 安图县| 自治县| 麻栗坡县| 西平县| 承德县| 枣庄市| 海原县| 衡东县| 噶尔县| 定襄县| 怀远县| 永登县| 阿巴嘎旗| 林州市| 渝北区| 田东县| 呈贡县| 永川市| 怀集县| 海晏县| 亚东县| 镇安县| 云阳县| 黄梅县| 武陟县| 买车| 石嘴山市| 边坝县|