2017-10-30 20 views
0

抽象クラスでthis microsoft articleを見ていました。明示的な変換の種類•変数やメンバデータ•抽象クラスの制限


•引数型
•関数の戻り値の型

の場合:記事

抽象クラスを使用することはできませんと言います私は正しく理解しています。この見積もりは、抽象クラス型が別のクラスのメンバ、別の関数の引数、または別の関数の戻り型になることができないことを意味します。これは我々がobj1が別のクラスの型である(BaseClass)obj1のようなものを型キャストすることができないことを明示的な変換の

タイプ

の意味をどう

を意味していますか?この理解が真実であれば、あるオブジェクトを別のクラス型にキャストする必要がありますか?

+0

抽象クラスにキャストすることはできません。 これはあなたの質問の第二の部分に役立つかもしれません:https://stackoverflow.com/questions/8622258/type-casting-to-an-abstract-class – Hameed

+1

制限事項のすべては、抽象クラスができないという事実に由来しますインスタンス化されます。キャストまたは他の型変換は、たとえ一時的であってもインスタンスになります。 ポインタを定義することはできますが、実際には抽象ではない子を指しています。または何もしないか、初期化されていません。しかし、それは抽象クラスのインスタンスを指していません。 – user4581301

答えて

0

抽象クラスは、基本クラスとして具体的に使用されるように設計されたクラスです。抽象クラスには少なくとも1つの純粋仮想関数が含まれます。クラス宣言の仮想メンバ関数の宣言で純粋な指定子(= 0)を使用して、純粋な仮想関数を宣言します。次 は、抽象クラスの例である:

class AB { 
public: 
    virtual void f() = 0; 
}; 

機能AB :: fは純粋仮想関数です。関数宣言は、純粋な指定子と定義の両方を持つことはできません。例えば、コンパイラは許可されません、次

struct A { 
    virtual void g() { } = 0; 
}; 

あなたはパラメータの型、関数の戻り値の型、または明示的な変換のタイプとして、抽象クラスを使用することはできません、でもあなたはのオブジェクトを宣言することができます抽象クラス。ただし、抽象クラスへのポインタや参照を宣言することはできます。次の例では、このことを示しています。baseクラスが抽象的ではありません

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

class derived : public base 
{ 
public: 
    void foo() 
    { 
    } 
}; 

int main() 
{ 

    derived pDerived; 
    static_cast<base>(pDerived); // Error 
} 

場合は、これをコンパイルすることができるようになります:

struct A { 
    virtual void f() = 0; 
}; 

struct B : A { 
    virtual void f() { } 
}; 

// Error: 
// Class A is an abstract class 
// A g(); 

// Error: 
// Class A is an abstract class 
// void h(A); 
A& i(A&); 

int main() { 

// Error: 
// Class A is an abstract class 
// A a; 

    A* pa; 
    B b; 

// Error: 
// Class A is an abstract class 
// static_cast<A>(b); 
} 
+0

'derived pDerived = new derived();'も許可されていません。 '*' – user4581301

+0

うん、おかげで、それを編集したと思う。時々頭の中でC#と混じり合う。 –

+4

コードに抽象クラスが含まれていません。 – juanchopanza

0

それはあなたがこのような何かを行うことができないことを意味します。

関連する問題