如何在基类中获取派生类的子类型

时间:2014-03-04 14:46:35

标签: c++ c++11

考虑以下示例

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::x中使用类型A

有没有办法做到这一点?

1 个答案:

答案 0 :(得分:5)

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

但是,您可以尝试将返回类型直接传递给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作为一个实用程序类,并将其作为成员嵌入子类中(“使组合优于继承”)。