0

C++ では、純粋な仮想メソッドにせずに、基本クラスのメソッドをそのすべての派生クラスによってオーバーライドするように要求することは可能ですか?

#include <iostream>
using namespace std;

class BaseClass{
    public:
    int printStuff(){ //find some way to require all derived classes to override this method
        cout << "Printing some stuff";
    }
};

class DerivedClass: public BaseClass{

};

int main(){
    cout << "Hello World!";
    return 0;
}
4

2 に答える 2

4

純粋仮想関数を使用したくないと言ったことは知っていますが、純粋仮想関数を使用して、それがあなたがやろうとしていることであれば、メソッドに定義を与えることができます(すでに知っているかどうかはわかりません):

class BaseClass{
public:
    virtual int printStuff() = 0;
};

// give the pure virtual function an implementation
int BaseClass::printStuff() {
    cout << "Printing some stuff";
}

class DerivedClass: public BaseClass{
    // compiler error; DerivedClass must override printStuff
};

class DerivedClass2: public BaseClass{
public:
    int printStuff() {
        return BaseClass::printStuff(); // use the base class's implementation
    }
};
于 2012-06-16T19:39:18.590 に答える
0

それは、require の意味によって異なります。通常、「require」は「完了しないとコンパイルに失敗する」という意味です。それがあなたが望むものなら、それを達成するためのメソッドを定義したいのは純粋仮想だけです。「プログラムは完了しないと機能しない」という意味であれば、実装が欠落していることをユーザーに通知する仮想メソッドのデフォルトの実装を提供できます。

class BaseClass {
protected:
    virtual int printStuff () {
        std::cout << "Nothing to print, please override printStuff()."
                  << std::endl;
        return -1;
    }
};

仮想メソッドの実装が提供される (つまり、仮想メソッドが の代入で宣言されていない0) 場合、それはもはや "純粋" ではありません。したがって、この手法は「純粋な仮想メソッドではない」という要件を満たしますが、それでも仮想メソッドです。

コードの一部でプレーンをインスタンス化する必要があると考えているため、これが必要だと思いますBaseClass。その場合は、BaseClass2 つの部分に分割することを検討してください。1 つは「純粋な」インターフェースであり、もう 1 つはインスタンス化するときに実際に使用するものを持っています。

class BaseObject {
    //...
};

class BaseClass {
protected:
    BaseObject base;
    virtual int printStuff () = 0;
};

したがって、BaseObjectではなくをインスタンス化しますBaseClass

于 2012-06-16T20:32:51.363 に答える