5

例を挙げましょう。

class base{
public:
virtual void abstract() = 0;
};

class derived:public base{
public:
void abstract(){cout << "Abstract\n";}
};

int main{
derived d;
d.abstract();
return 0;
}

それは、次のように別の方法で書くこともできます。

class base{
    public:
    void abstract(){cout << "Abstract\n";}
    };

    int main{
    base b;
    b.abstract();
    return 0;
    }

それも同じ結果を提供しています。実際、ここではクラスを派生させる必要はありません。私は抽象クラスに関する多くの記事を読みましたがit says we can not instantiate base classpure virtual functionユーザーにdefine the function. しかし、両方のケースで上記のコードが表示される場合、同じ結果が得られます ( or output)。ここで私の質問は、abstractクラスがどのように役立つかです。

4

7 に答える 7

2

以下に例を示します。プログラムでさまざまな形状の面積を計算する必要があるとします。

class shape{
public:
    virtual double area() = 0;
};

class triangle:public shape{
public:
    triangle(double base, double height) : b(base), h(height) {}
    double area(){ return 0.5 * b * h; }
private:
    double b;
    double h;
};

class circle:public shape{
public:
    circle(double radius) : r(radius) {}
    double area(){ return M_PI * r * r; }
private:
    double r;
};

int main{
    std::vector<shape*> shapes;

    //add whatever shapes you want here
    shapes.push_back( new triangle(4, 5) );
    shapes.push_back( new circle(3) );

    double dTotal = 0.0;
    std::vector<shape*>::iterator i;
    for (i = shapes.begin(); i != shapes.end(); i++)
    {
        dTotal += (*i)->area();
        delete *i;
    }

    cout << dTotal;
    return 0;
}

長方形、円、12 面体などの形状を非常に簡単に作成し、それらが独自の面積を計算する方法の詳細を知らなくても、すべて同様に扱うことができるようになりました。同時に、shape独自の領域を定義することは意味がありません。

EDIT:別の派生クラスを追加し、抽象メソッドを使用してそれらを利用しました。

于 2013-04-17T11:23:59.880 に答える
1

の目的は、サブクラスのabstract (base-)classを定義することです。interfaceこのようにして、クラスができる必要があること (メソッド) を決定できますが、それがどのように機能するか (実装) は決定できません。クラス
から派生するとき、サブクラスで特定の動作を提供することを約束します。abstractこれを使用すると、関数はオブジェクトを使用して、特定の動作を詳細に知らなくてもアクションを実行できます。フレームワークのように、概念や UI コントロールなどを表す
クラス階層がいたるところにあります。 第二に、クラスのインスタンスを持つことが意味をなさない場合があります。クラスを考えてみましょう。はどのように定義されていますか? をインスタンス化するのは意味がありませんが、むしろ aまたはから派生した.NET
AnimalAnimalAnimalDogCatAnimal.

于 2013-04-17T11:20:39.607 に答える
1

抽象クラスは、クラスからオブジェクトを作成したくない場合にも役立ちます。

このことを考慮、

/* Abstract Class Animal */
class Animal
{
public:
    virtual void eat() = 0;
    virtual void walk() = 0;
};

class Dog:public Animal
{
public:
    void walk() { std::cout<<"\nWalk with Paws"; }   
    void eat()  { std::cout<<"\nEat meat";       }
};

class Horse:public Animal
{
public:
        void walk() {  std::cout<<"\nWalk with Hooves"; }   
        void eat()  {  std::cout<<"\nEat Grass";        }
};

int main()
{
    Dog d;
    Horse h;

    d.eat();
    d.walk();
    h.eat();
    h.walk();
return 0;
}

ここでは、タイプのオブジェクトを作成したくありませんAnimalsleep eatそのオブジェクトには、などの特定の動作はありません。

など のabstractサブクラスを作成するためにこのクラスを利用できます。これらは派生クラスで実装する必要があります。そうしないと、コンパイラでエラーが発生します。DogCatpure virtual functions

これにより、すべてのサブクラスが目的のメソッドを持つことが保証され、次のundefinedようなオブジェクトを作成することにもなりません。Animal

于 2013-04-17T11:26:24.440 に答える
1

「抽象的」な言葉で言えば、抽象クラス (完全に抽象化されている場合はインターフェースとも呼ばれます) は、一連の同様のクラスの実装から抽象化されます。ここで、類似とは、同じ機能セットを持っているが、実装が異なる可能性があることを意味します。

抽象クラス自体は実装を定義しません。プログラム内で抽象クラス (へのポインターまたは参照) を渡すと、1 つの「閉じたパッケージ」のみが渡され、対話 (たとえば、シェイク) できます。しかし、インターフェースがどのように実装されているか (例えば、シェイクすると何が起こるか) を含め、パッケージの中身を隠します。

そうは言っても、抽象クラスは抽象化を 1 レベル高くするだけです。クラスはオブジェクトが持つ属性と動作を記述しますが、抽象クラスはオブジェクトで何ができるかのみを記述します。実際の実装のみが動作を定義します。

そうは言っても、1 つの重要な事実は、抽象クラスのインスタンスを作成できないということです。

ソフトウェアを設計するとき、抽象クラス/インターフェースは抽象化の非常に重要な方法です。ソフトウェアの一部が特に知らない何かとやり取りしたい場合はいつでも、実際の型を指定せずに、そのようなオブジェクトが提供する必要がある機能を記述するインターフェイスを作成できます。これにより、さまざまなタイプのオブジェクトを簡単に渡すことができます。そのようなインターフェース/抽象クラスへのポインター/参照を取る関数は、実際の型を知らなくてもオブジェクトと対話できます。

于 2013-04-17T11:21:52.987 に答える