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

当对象实际上不是该类型时调用派生方法可能会导致未定义的行为。我认为你真正想要的是 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 回答
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 回答
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 回答