考虑以下示例
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
。
有没有办法做到这一点?
答案 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
作为一个实用程序类,并将其作为成员嵌入子类中(“使组合优于继承”)。