考虑下面的例子
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
class内部的类型A
。
有什么办法吗?
这行不通。为了实例化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
一个实用程序类并将其作为成员嵌入到子类中(“偏爱组成而不是继承”)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句