2014-03-04 65 views
3

请看下面的例子如何获得派生类的子类型在基类中

template <typename T> 
class A 
{ 
     typename T::x a;   //not used 
     virtual typename T::x* function()=0; 
}; 

class B:public A<B> 
{ 
public: 
     typedef XXX x; 
     x obj; 
     x* function() 
     { 
      return &obj; 
     } 

}; 

在这里,我想使用的类型B::xA类。

有没有办法做到这一点?

+0

你不这样做吗? – Paranaix

+0

获取错误'无效使用未定义类型'B类' – rajenpandit

+1

是不是这个问题非常类似于讨论[这里](http://stackoverflow.com/q/17478621/420683)? – dyp

回答

5

这不起作用。为了实例化A,编译器需要至少有一个前向声明x。但是你不能转发declare类型的成员,因为这是类型的实现细节,并且意味着你已经知道了关于类的一些部分。

你可以,不过,要返回类型通过直接A,并以此作为返回类型:

template <typename T> 
class A 
{ 
public: 
    typedef T ret_type; 
    virtual ret_type* function() = 0; 
}; 

class B : public A<int> 
{ 
public: 
    A::ret_type obj; 
    virtual A::ret_type* function() override 
    { 
     return &obj; 
    } 
}; 

通过这种方法,你可以这样做:

class X : public A<int> { ... }; 
class Y : public A<int> { ... }; 

A<int>* p1 = new X(); 
A<int>* p2 = new Y(); 
p1->function(); 
p2->function(); 

.. 。使基类更有用。

父母不需要知道任何关于孩子的事情,否则继承变得毫无意义。在你的情况下,A可以被认为是一个接口,任何实现接口A<int>的类将表现相同。相反,如果您将子级传递给A,则每个接口实现都是不同且唯一的,即使它可能具有完全相同的返回类型。如果你真的需要这个,可以考虑将A作为一个实用类并作为成员嵌入到子类中(“支持继承的组合”)。

+1

感谢您的建议,我想我可以通过使用这个概念来实现愿望结果。 – rajenpandit