1

ベースと派生例外、ストアのパブリック内部クラスがあります。

//base class - ProductException
    class ProductException: exception
    {
    protected:
        const int prodNum;
    public:
        //default+input constructor
        ProductException(const int& inputNum=0);
        //destructor
        ~ProductException();
        virtual const char* what() const throw();
    };

    //derived class - AddProdException
    class AddProdException: ProductException
    {
    public:
        //default+input constructor
        AddProdException(const int& inputNum=0);
        //destructor
        ~AddProdException();
        //override base exception's method
        virtual const char* what() const throw();
    };

派生例外をスローするこの関数:

void addProduct(const int& num,const string& name) throw(AddProdException);
void Store::addProduct( const int& num,const string& name )
{
    //irrelevant code...
    throw(AddProdException(num));
}

関数を呼び出して例外をキャッチしようとする関数:

try
{
    switch(op)
    {
        case 1:
        {
            cin>>num>>name;
            st.addProduct(num,name);
            break;
        }
    }
}
...
catch(Store::ProductException& e)
{
    const char* errStr=e.what();
    cout<<errStr;
    delete[] errStr;
}

派生クラスはキャッチされるはずですが、「ハンドルされていない例外」というエラーが発生し続けます。理由はありますか?ありがとう!

4

2 に答える 2

4

publicキーワードがない場合、継承はデフォルトで非公開と見なされます。これはAddProdExceptionis-not を意味しProductExceptionます。次のように公開継承を使用します。

class AddProdException : public ProductException
{
public:
    //default+input constructor
    AddProdException(const int& inputNum=0);
    //destructor
    ~AddProdException();
    //override base exception's method
    virtual const char* what() const throw();
};

std::exceptionまた、パブリックから継承するProductExceptionこともできます。そうしないと、 s をキャッチすることもできなくなりstd::exceptionます (さらに良いのは、 from std::runtime_error)。

于 2012-06-16T10:58:40.000 に答える
4

理由は、プライベート継承を使用しているため、でAddProdExceptionはないためです。ProductException

class AddProdException: ProductException {};

パブリック継承を使用する必要があります。

class AddProdException: public ProductException {};

後者が であると仮定するProductExceptionと、同じことが およびに適用されます。exceptionstd::exception

于 2012-06-16T10:59:26.600 に答える