是否可以将具有派生类实例的基类作为基类函数之一的参数?例如:
class A
{
virtual void foo(B b[]);
};
Class B: public A
{
void foo(B b[]);
};
这合法吗? A类还需要包含B类的头文件,这也有问题吗?
答案 0 :(得分:7)
可以通过前瞻声明:
class B;
class A
{
virtual void foo(B b[]);
};
Class B: public A
{
void foo(B b[]);
};
但这是一个主要的代码味道。请说明你想要实现的目标,这看起来像是一个错误的设计。
答案 1 :(得分:2)
您可以使用奇怪的重复模板模式:
template <class T>
class A
{
public:
virtual void foo(T t[]);
};
class B: public A<B>
{
public:
void foo(B b[]);
};
答案 2 :(得分: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();
};