派生クラスが基本クラスで定義されたインターフェイスを実装する必要があることを確認するのは非常に簡単です。
それは純粋仮想関数です。
例えば:
class BaseClass
{
...
virtual void print()=0;
...
}
class DerivedClass :public BaseClass
{
// function must be implement, otherwise compiler will complain ...
void print()
{
}
};
基本クラスで静的インターフェイスを定義し、そのインターフェイスを派生クラスで実装する必要があることを確認できますか?
こんなもの欲しい
class BaseClass
{
...
static void print(); // base class only define static interface
...
}
class DerivedClass :public BaseClass
{
// derived class must implement interface, otherwise compiler will complain ...
static void print()
{
}
};
これについてはわかりません。
御時間ありがとうございます。
仮想静的関数を作成することはできません。静的関数を呼び出すときは、コンパイル時にその関数を定義するクラスを常に知っているという単純な理由からです。メソッドを呼び出しているオブジェクトのタイプがわからない仮想関数とは異なります。例えば:
class A
{
public:
virtual void f() {printf("A");}
};
class B : public A
{
virtual void f() override {printf("B");}
};
void g(A& a)
{
a.f();
}
int main()
{
B b;
g(b);
return 0;
}
上記の例では、関数g内で、正しい関数が呼び出されます(B :: f)。関数のコンパイル中は、引数のタイプがわからない場合でも(AまたはAから派生した任意のクラスである可能性があります)。f()を仮想化しないと、メソッドfをオーバーライドするのではなく、オーバーロードすることになります。つまり、次の例では、「B」と予想される場合でも、出力は「A」になります。
class A
{
public:
void f() {printf("A");}
};
class B : public A
{
void f() {printf("B");}
};
void g(A& a)
{
a.f();
}
int main()
{
B b;
g(b);
return 0;
}
これは重大なバグを引き起こす可能性があり、基本クラスのメソッドをオーバーロードしないこと、および仮想メソッドをオーバーライドしてこれらのバグを回避するときは常にoverrideキーワードを使用することをお勧めします。
静的関数を作成するときは、単にオーバーロードするだけで、コンパイルエラーは発生しません。ただし、追跡が非常に難しいバグを隠す可能性があるため、おそらくオーバーロードしないでください(実際には、A :: f()が呼び出されているときにB :: f()が呼び出されていることは確かです)。さらに、静的インターフェイスなどがないため、派生クラスに静的インターフェイスを実装するように「強制」することはできません。仮想静的関数がないため、この関数を実装するインターフェイスへの参照またはポインターを渡すことはできません。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加