0

次のコードでは、クラスの関数set(int, int)Base、派生クラスの関数を呼び出したいと思いますshowK()。これを行う方法はありますか?

showK()クラスで関数を宣言Baseできず、仮想化できません。これは私にとっての制限です。

class Base{
    int i, j;
    public:
    void set( int, int );
    void show() { cout << i << " " << j << "\n"; }
};

void Base:: set(int a, int b)
{ 
    i=a; j=b; 
    //Here I want to call the function showk() of class derived . Is there a way to call?.
}

class derived : public base {
    int k;
    public:
    derived(int x) { k=x; }
    virtual void showk() { cout << k << "\n"; }
};

int main()
{
    derived ob(3);
    ob.set(1, 2); // access member of base
    ob.show(); // access member of base
    ob.showk(); // uses member of derived class
    return 0;
}

前もって感謝します。

4

3 に答える 3

1

Baseクラスの関数set(int、int)で、派生クラス関数showK()を呼び出したいと思います。これを行う方法はありますか?BaseクラスでshowK()関数を宣言できず、仮想化できません。これは私にとっての制限です

これが派生クラスのインスタンスであることがわかっている場合は、これを派生にキャストして関数を呼び出すことができます...

void Base:: set(int a, int b)
{ 
    i=a; j=b; 
    ((derived* const) this)->showk();
}

代わりに、いつでもdynamic_castを実行して、派生したものかどうかをテストできます。派生していない場合は、別のことを実行したい場合は、

(そうは言っても、このような状況にある場合は、設計に問題がある可能性があります。一般に、基本クラスは派生クラスを「知っている」べきではありません。)

于 2012-04-05T12:35:02.457 に答える
1

オブジェクトが実際にはその型ではないときに派生メソッドを呼び出すと、未定義の動作が発生する可能性があります。あなたが実際に望んでいるのは、オブジェクトが派生型の場合、set() メソッドで showk() を呼び出すことだと思います。これは通常、次のように行われます。

class Base{
    int i, j;
    public:
    virtual void set( int, int );
    void show() { cout << i << " " << j << "\n"; }
};

void Base:: set(int a, int b)
{ 
    i=a; j=b; 
}

class derived : public base {
    int k;
    public:
    derived(int x) { k=x; }
    virtual void set(int a,int b);
    virtual void showk() { cout << k << "\n"; }
};

void derived::set(int a,int b)
{
  base::set(a,b);
  showk();
}

int main()
{
    derived ob(3);
    ob.set(1, 2); // access member of base
    ob.show(); // access member of base
    ob.showk(); // uses member of derived class
    return 0;
}
于 2012-04-05T12:33:27.403 に答える
0
template <class derived_type>
class Base{
    int i, j;
    public:
    void set( int, int );
    void show() { cout << i << " " << j << "\n"; }
};

template <class derived_type>
void Base<derived_type>:: set(int a, int b)
{ 
    i=a; j=b; 
    static_cast<derived_type*>(this)->showk();
}

class derived : public Base<derived> {
    int k;
    public:
    derived(int x) { k=x; }
    virtual void showk() { cout << k << "\n"; }
};

int main()
{
    derived ob(3);
    ob.set(1, 2); // access member of base
    ob.show(); // access member of base
    ob.showk(); // uses member of derived class
    return 0;
}

http://en.wikipedia.org/wiki/Curiously_recurring_template_pattern

于 2012-04-05T12:41:55.157 に答える