C++ での純粋仮想関数とインターフェイス実装の使用

1. なぜ純粋仮想関数を導入するのでしょうか?

通常の仮想関数の場合、サブクラスが対応する仮想関数をオーバーライドしない場合、親クラス ポインターは親クラスの関数を呼び出してそれを実装することしかできません。ただし、親クラスは特定の実装を提供できない場合があり、それは単なる抽象的な概念です。例えば、calculationという親クラスを抽象化しましたが、実際には演算の具体的な実装は提供できませんが、継承したサブクラスでさまざまな計算を実装できるようにしたいという要望から、具体的な実装を省略したメソッドも用意されています。 . 仮想関数は純粋仮想関数と呼ばれます。

2. 純粋仮想関数の使用

 1 #include <iostream>
 2 using namespace std;
 3
 4 class abstructParent
 5 {
    
    
 6 public:
 7    void function1()
 8    {
    
    
 9        cout<<" abstructParent hello C++"<<endl; 
10
11    }
12    virtual void function2() = 0; //纯虚函数 
13
14 };
15
16 class Child :public  abstructParent
17 {
    
    
18 public:
19    void function2()
20    {
    
    
21        cout<<" Child hello C++"<<endl; 
22
23    }
24 };
25
26 int main(int argc, char** argv) {
    
    
27
28    Child obj;
29
30    obj.function1();
31    obj.function2();
32
33    return 0;
34 }

1. 親クラスを使用してオブジェクトを直接定義する (専門的にはインスタンス化と呼ばれます) 場合、コンパイルで直接エラーが報告されるため、純粋仮想関数を持つクラスは、対応する固有の関数が与えられないため、オブジェクトに直接インスタンス化できません。情報を達成する

2. 純粋仮想関数を含むクラスは通常、抽象クラスと呼ばれます。名前は非常に適切です。宣言のみがあり、特定の実装はありません。抽象クラスには他の実装も含めることができますが、純粋仮想関数を継承する必要があるため、オブジェクトをインスタンス化することはできません。実装する

3. 純粋な仮想関数の場合、主にインターフェイスを実装し、継承されたサブクラスに対応するメソッドを強制的に実装するために使用されます。もちろん、実装する必要はありません。ただし、仮想関数を実装していない継承されたサブクラスは、まだ抽象クラスであり、オブジェクトにインスタンス化することはできません。

3. 純粋仮想関数実装インターフェース

 1 #include <iostream>
 2 using namespace std;
 3
 4 /* 接口抽象类的定义 */ 
 5 class Interface {
    
    
 6 public:
 7    virtual void method1() = 0;
 8    virtual void method2() = 0;
 9 };
10
11 class Device1 : public Interface
12 {
    
    
13 public:
14    virtual void method1(void) 
15    {
    
    
16        cout<<"Device1 method1"<<endl; 
17    }
18    virtual void method2(void) 
19    {
    
    
20        cout<<"Device1 method2"<<endl; 
21    }
22};
23
24 class Device2 : public Interface
25 {
    
    
26 public:
27    virtual void method1(void) 
28    {
    
    
29        cout<<"Device2 method1"<<endl; 
30    }
31    virtual void method2(void) 
32    {
    
    
33        cout<<"Device2 method2"<<endl; 
34    }
35 };
36
37 class Process {
    
    
38 public:
39    void Parse(Interface *api) {
    
    
40        api->method1();
41        api->method2();
42    }
43 };
44
45 int main(void)
46 {
    
    
47    Process process;
48
49    Device1  dev1;
50    Device2  dev2;
51
52    process.Parse(&dev1);
53    process.Parse(&dev2);
54
55    return 0;
56 }

インターフェース抽象クラスを構築することで、異なるデバイスがこのクラスを継承してインターフェース機能を統一することができ、同様のインターフェース処理をさせたい場合には、インターフェース抽象クラスを直接継承し、最終的には同じ処理プロセスを利用することで、異なる関数を呼び出すことができます。


Lingsheng Academy のプロジェクト クラスをお勧めします。個人的には先生の教え方が上手だったと思います。共有したいと思います:
Lingsheng Platinum Learning Card (インフラストラクチャ/高性能ストレージ/golang クラウド ネイティブ/オーディオとビデオ/Linux カーネルを含む)
https://xxetb.xet .tech/s/VsFMs

おすすめ

転載: blog.csdn.net/qq_40135848/article/details/133577658