抽象クラスは、基本クラスとして具体的に使用されるように設計されたクラスです。抽象クラスには少なくとも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);
}
抽象クラスにキャストすることはできません。 これはあなたの質問の第二の部分に役立つかもしれません:https://stackoverflow.com/questions/8622258/type-casting-to-an-abstract-class – Hameed
制限事項のすべては、抽象クラスができないという事実に由来しますインスタンス化されます。キャストまたは他の型変換は、たとえ一時的であってもインスタンスになります。 ポインタを定義することはできますが、実際には抽象ではない子を指しています。または何もしないか、初期化されていません。しかし、それは抽象クラスのインスタンスを指していません。 – user4581301