【问题标题】:How to get subtype of a derived class in base class如何在基类中获取派生类的子类型
【发布时间】:2014-03-04 14:46:35
【问题描述】:

考虑以下示例

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;
        }

};

这里我想在A类中使用B::x类型。

有什么办法吗?

【问题讨论】:

  • 你不是已经这样做了吗?
  • 收到错误invalid use of undefined type class B`
  • 这个问题是不是和here讨论的问题很相似?
  • @dyp 是类似的,但是在这种情况下由于所讨论的类是父类,所以限制更多。

标签: c++ c++11


【解决方案1】:

这不起作用。为了实例化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&lt;int&gt; 的类都将表现相同。相反,如果您将子类传递给A,则每个接口实现都是不同且唯一的,即使它可能具有完全相同的返回类型。如果您真的需要这个,请考虑将A 作为一个实用程序类并将其作为成员嵌入到子类中(“优先组合而不是继承”)。

【讨论】:

  • 感谢您的建议,我想我可以通过使用这个概念来达到预期的结果。
猜你喜欢
  • 1970-01-01
  • 2015-03-30
  • 1970-01-01
  • 2010-11-01
  • 2012-07-09
  • 1970-01-01
  • 1970-01-01
  • 2011-07-06
  • 2018-11-19
相关资源
最近更新 更多