0

是否可以有一个基类,它具有派生类的实例作为基类函数之一的参数?例如:

class A
{
  virtual void foo(B b[]);
};
Class B: public A
{
  void foo(B b[]);
};

这合法吗?A 类也需要包含 B 类的头文件,这也有问题吗?

4

3 回答 3

7

前向声明是可能的:

class B;
class A
{
  virtual void foo(B b[]);
};
Class B: public A
{
  void foo(B b[]);
};

但这是一个主要的代码气味。请说明您要实现的目标,这看起来像是一个错误的设计。

于 2012-08-08T22:36:21.430 回答
2

您可以使用奇怪重复的模板模式:

template <class T>
class A
{
public:
    virtual void foo(T t[]);
};

class B: public A<B>
{
public:
    void foo(B b[]);
};
于 2012-08-08T22:34:09.960 回答
0

一种方法可能是定义一个接口类,该类定义您希望在派生类中公开的功能。如果您想在基类的成员函数中访问派生类 B 内部,那么这种方法并不比已经发布的方法好。

class IntfB
{
  public:
    virtual void meth1() = 0;
    virtual void meth2() = 0;
};

class A
{
  public:
    virtual void foo(IntfB b[]);
};

class B : public A, public IntfB
{
  public:
    virtual void meth1();
    virtual void meth2();
};
于 2012-08-08T23:43:49.723 回答