2012-08-08 80 views
0

成员是否有可能有一个具有派生类的实例作为参数的基类的功能中的一个基类?例如:C++继承的基类派生使用类

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

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

回答

7

有可能与前向声明:

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

这是一个重大的代码味道。请说明你想达到的目标,这看起来像一个错误的设计。

+3

+1 **这是一个主要的代码气味** – 2012-08-08 22:39:24

2

你可以使用奇异递归模板模式:

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

class B: public A<B> 
{ 
public: 
    void foo(B b[]); 
}; 
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(); 
};