c ++子类作为方法的参数

时间:2012-06-22 14:00:11

标签: c++ class parameters subclass

我想写两个类,在超类中我需要方法女巫作为参数有一个子类,如下例示例:

class class1
{
    int a;
    void print(class2 k)
    {
        cout<<k.b*a;
    }  
};

class class2 :public class1
{
    public:
    int b;
};

不幸的是,这是不对的;-)我无法弄明白,有人可以帮忙吗?

3 个答案:

答案 0 :(得分:2)

使用转发声明并将实施移到class

之外
class class2;
class class1
{
    int a;
    void print(class2 k);
};

class class2 :public class1
{
    public:
    int b;
};

您无法将该方法保持为内联,因为您需要class2的完整类型,但此时无法使用该类型。

但这里的主要问题是设计,这是错误的。为什么基类需要知道并且更多 - 因此从派生类调用方法?

答案 1 :(得分:0)

class class2;

class class1
{
    int a;
    inline void print(class2 &k); //pass by reference, but implemented after class2 is completely known to the compiler.
};

class class2 :public class1
{
    public:
    int b;
};

void class1::print(class2 &k)
{
    cout<<k.b*a;
}  

答案 2 :(得分:0)

问题的一个可能解决方案是不在基类中实现print(),而是强制任何继承类使用纯虚函数来实现它。目前,你' d probbaly使用以下代码调用您的代码:

class2 c2;
c2.b = 20; // for example
class1 c1;
c1.print( c2 );

但也许更好的实现方法如下:

class class1
{
protected:
    int a;

public:
    virtual void print() const = 0;
};

class class2 : public class1
{
public:
    int b;
    void print() const;
};

void class2::print() const
{
    cout << b * a;
}

所以现在class2必须实现打印功能,这在某种意义上是正确的,因为class2应该知道class1但反之亦然。现在你可以这样做:

class2 c2;
c2.b = 20; // for example
c2.print()

当然,这可能无法帮助您完成您想做的事情,但我认为这通常是解决您所描述问题的更好方法。