1. 程式人生 > >C/C++ :C++實函式、虛擬函式、純虛擬函式、函式重寫

C/C++ :C++實函式、虛擬函式、純虛擬函式、函式重寫

C++實函式、虛擬函式、純虛擬函式、函式重寫

和以前一樣,先做好準備工作。程式碼和以前差不多。

首先是父類,People;

標頭檔案:



#ifndef PEOPLE_H
#define PEOPLE_H

#include<iostream>

using namespace std;

class People{
    public:
        People();//預設是構造方法
        People(int age, int sex);
        int get_age();
        int get_sex();
        void say_hello();

    private:
        int age;
        int sex;
};

#endif // PEOPLE_H

主檔案:




#include "People.h"

People::People(){
    this -> age = 18;
    this -> sex = 1;
}//預設的構造方法

People::People(int age, int sex){
    this -> age = age;
    this -> sex = sex;
}


int People::get_age(){
    return this -> age;
}

int People::get_sex(){
    return this -> sex;
}

void People::say_hello(){
    cout << "People: hello world !" << endl;
}

然後是子類Zero:

標頭檔案:

<span style="font-size:18px;">


#ifndef ZERO_H
#define ZERO_H

#include "People.h"

class Zero:public People{
    public:
        Zero(int age, int sex);
        void say_hello();
};

#endif // ZERO_H
</span>

主檔案:



#include "Zero.h"

Zero::Zero(int age, int sex):People(age ,sex){

}


void Zero::say_hello(){
    cout << "Zero: hello world !" << endl;
}

好,現在我們先來隨便寫個main檔案:

<span style="font-size:18px;">

#include "Zero.h"

int main()
{
    int a = 20;
    int b = 1;
    People *p = new Zero(a, b);
    p -> say_hello();
    delete p;
    return 0;
}
</span>

我們注意到用People類定義的p指向的是Zero,而我們用p指向的say_hello,是輸出的是People類的呢?

還是Zero類的hello world 呢?

答案是People:helloworld !。。。我們明明指向的是Zero的例項,而輸出的是People類的say_hello;

而這是為什麼呢?在C++裡, 當我們在子類中將父類中的函式重寫的而且動態的定位到這個方法的話。

這個方法應該是虛擬函式。。所以,我們在稍微改動一下。

首先是People.h

<span style="font-size:18px;">



#ifndef PEOPLE_H
#define PEOPLE_H

#include<iostream>

using namespace std;

class People{
    public:
        People();//預設是構造方法
        People(int age, int sex);
        int get_age();
        int get_sex();
        virtual void say_hello();

    private:
        int age;
        int sex;
};

#endif // PEOPLE_H
</span>

再是Zero.h
<span style="font-size:18px;">


#ifndef ZERO_H
#define ZERO_H

#include "People.h"

class Zero:public People{
    public:
        Zero(int age, int sex);
        virtual void say_hello();
};

#endif // ZERO_H
</span>

將兩個標頭檔案中的say_hello方法都以虛擬函式方式構造。而此時輸出的say_hello,

就是Zero類的“Zero:hello world !”。。這也就是函式的重寫。。

而在C++中,出了虛擬函式以外,還有一種函式,叫做純虛擬函式。它呢,主要是在父類中不實現,我們把它在子類中實現。

首先, 我們在People.h中寫入

<span style="font-size:18px;">

        virtual void eat() = 0; //指明為抽象方法。
</span>

此時,我們執行時,就會報錯了,這時,我們要在Zero.h中寫入它的方法。

<span style="font-size:18px;">


#ifndef ZERO_H
#define ZERO_H

#include "People.h"

class Zero:public People{
    public:
        Zero(int age, int sex);
        virtual void say_hello();
        virtual void eat(){
            cout << "eat: 0" << endl;
        }
};

#endif // ZERO_H
</span>

此時,我們執行,就沒有錯誤了。然後,我們來執行輸出它。
<span style="font-size:18px;">

    p -> eat();</span>

雖然,我們沒有在People類中來實現它,但還是結果順利輸出了。

PS:就算前進的只是一小步,那也是一種進步!

相關推薦

c語言輸入一行字元,分別統計出其中英文字母空格數字和其他字元的個數。

輸入一行字元,分別統計出其中英文字母、空格、數字和其他字元的個數。解:程式:#include <stdio.h>int main(){char c;int letters=0,space=0

C語言編寫一個程式統計輸入字串中,各個數字空白字元以及其他所有字元出現的次數。

#include<stdio.h> int main() {      int c = 0;      int num_count = 0;      int emp_count = 0;      int els_count = 0;            w

0基礎學C語言C語言視頻教程免費分享!

軟件 適合 密碼 計算機程序 計算機編程 學c語言 應用軟件 技術分享 朋友 C語言是一種通用的、過程式的編程語言,廣泛用於系統與應用軟件的開發。作為計算機編程的基礎語言,長期以來它一直是編程愛好者追捧而又比較難學的語言。C語言是一種計算機程序設計語言,它既具有高級語言的特

c++基礎C++的一些基本概念

//參考書:visual c++面向物件程式設計教程(王育堅) 一:C++的成員屬性有3種 1.private屬性(預設屬性)的成員只能由本類成員函式訪問或呼叫; 2.protect屬性的成員只能由本類成員函式或派生類成員函式訪問或呼叫; 3.public屬效能被本類函式或其他類函式通過物件訪問或呼

Microsoft C# 概覽C# 和 JAVA

C# 和 JAVA 是兩個不同的面嚮物件語言,兩者有類似,同時更有不同。C# 和 JAVA 都是從祖父類”Object”派生的。在 C#裡的全部類都是從System.Object 類衍生的,在JAVA裡

Microsoft C# 概覽C# 控制檯應用程式

下面是一個簡單的C#控制檯應用程式。這個程式從main()函式開始。可以新建一個控制檯應用工程,並且拷貝和貼上下面的C#原始碼。 using System; using System.Collecti

破解/優化C++程式碼C++程式碼的編譯過程

這篇文章會講解 Visual C++ 編譯器的資料流——首先會以一段C++源程式開始,以對應的二進位制程式結束。這篇文章很簡單——一切才剛剛開始。 首先我們來看看從命令列開始,編譯一個單一檔案的程式 APP.cpp 時會發生什麼(如果你想從Vistual Studio 來啟動編譯,下圖還

破解C++程式碼C++程式碼的編譯過程

這篇文章會講解 Visual C++ 編譯器的資料流——首先會以一段C++源程式開始,以對應的二進位制程式結束。這篇文章很簡單——一切才剛剛開始。 首先我們來看看從命令列開始,編譯一個單一檔案的程式 APP.cpp 時會發生什麼(如果你想從Vistual Studio 來啟動

C++基礎C++標準庫之棧(stack)和佇列(queue)

在C++標準庫(STL)中,實現了棧和佇列,方便使用,並提供了若干方法。以下作簡要介紹。 1、棧(stack)說明及舉例: 使用棧,要先包含標頭檔案 : #include<stack> 定義棧,以如下形式實現: stack<Type> s; 其中Ty

C#開發c#基本資料型別及其預設值

參考網站:https://blog.csdn.net/simonezhlx/article/details/4099904//值型別C# 型別      .NET Framework 型別bool        System.Boolean               4By

C++基礎C++標準庫之map簡介

1、綜述         Map是C++STL中眾多的Container(容器)之一,與python的字典略類似,Map作為一個關聯容器,將key與value相互關聯,其中key為關鍵字,是不可更改的,而value是key值的相對應值。Map所提供的一對一的資料對映關係,在

C/C++ C++函式虛擬函式虛擬函式函式重寫

C++實函式、虛擬函式、純虛擬函式、函式重寫 和以前一樣,先做好準備工作。程式碼和以前差不多。 首先是父類,People; 標頭檔案: #ifndef PEOPLE_H #define PEOPLE_H #include<iostream> usi

C++11---虛擬函式虛擬函式多型虛擬函式(抽象類介面)

 介紹虛擬函式之前,先舉一個繼承中的例項 class A { public: void show()const {cout<<"A";}; }; class B:public A //B繼承於A { public: void show()cons

[Visual Studio C++][MFC] fstream函式的使用方法C++檔案寫入讀出函式

文章轉自:https://www.cnblogs.com/zhoug2020/p/8427277.html [導讀]      ofstream是從記憶體到硬碟,ifstream是從硬碟到記憶體,其實所謂的流緩衝就是記憶體空間     &

C/C++雜記虛擬函式的實現的基本原理 虛擬函式

部落格園 首頁 新隨筆 聯絡 訂閱 管理 1. 概述 簡單地說,每一個含有虛擬函式(無論是其本身的,還是繼承而來的)的類都至少有一個與之對應的虛擬函式表,其中存放著該類所有的虛擬函式對應的函式指標。例: 其中: B的虛擬函式表中存放著B::fo

C++中的虛擬函式抽象類介面

純虛擬函式就是沒有函式體的虛擬函式,通常都以下列格式定義純虛擬函式: class <類名> { virtual <型別><函式名>(形參表) = 0; ... } 在虛擬函式後面加"=0",這並不代表虛擬函式返回值為

C語言函式指標函式指標陣列函式指標陣列的指標

一.函式指標 1.定義理解 函式指標:是一個指標,存放函式地址的指標。 函式的地址可以通過取地址函式名拿到,也可以通過函式名直接拿到。 2.函式指標 (1)定義一個函式test void test(char *str) { printf("

問題十五C++中抽象類,虛擬函式是什麼鬼?怎麼測試

該篇內容提要: 1,理論解釋,來自網上; 15.1 抽象類、虛擬函式是什麼鬼? 一、純虛擬函式定義.      純虛擬函式是在基類中宣告的虛擬函式,它在基類中沒有定義,但要求任何派生類都要定義自己的實現方法。在基類中實現純虛擬函式的方法是在函式原型後加“=0”二、引入

C++】在繼承中虛擬函式虛擬函式普通函式,三者的區別

1.虛擬函式(impure virtual)   C++的虛擬函式主要作用是“執行時多型”,父類中提供虛擬函式的實現,為子類提供預設的函式實現。   子類可以重寫父類的虛擬函式實現子類的特殊化。   如下就是一個父類中的虛擬函式: class A { public: virt

[收集]c++抽象類虛擬函式以及巧用虛解構函式實現介面類

在Java、C#中有關鍵詞abstract指明抽象函式、抽象類,但是在C++中沒有這個關鍵詞,很顯然,在C++也會需要只需要在基類宣告某函式的情況,而不需要寫具體的實現,那C++中是如何實現這一功能的,答案是純虛擬函式。 含有純虛擬函式的類是抽象類,不能生成物件,只能派生。