C ++模板基础 - 函数接受子类或超级

时间:2010-09-23 16:09:39

标签: c++ templates

假设您有一个继承自超类A的子类B.您需要一个可以接受A或B的函数。

template <typename T>
void someFunc(T* pObj, bool someOtherArg)
{
    pObj->AnInheritMethod();
    if (pObj->IsASub())
    {
       pObj->ANonInhertMethod();
    }
}

当我编译它(Visual Studio 6)时,我得到:

error C2065: 'pObj' : undeclared identifier

我离开基地了吗?

3 个答案:

答案 0 :(得分:2)

您不需要模板,这是一种由多态性提供的自由行为。

编辑:如果您写的内容如下:

if (pObj->IsASub())

然后你的设计可能出现了问题。该方法适用于派生链中的任何类型。

答案 1 :(得分:2)

您不需要功能模板;以下将做得很好:

void someFunc(A* pObj)
{
    pObj->AnInheritMethod();
    if (B* pObjAsB = dynamic_cast<B*>(pObj))
    {
        pObjAsB->ANonInheritMethod();
    }
}

或者,如果您希望使用IsASub()成员函数代替dynamic_cast

void someFunc(A* pObj)
{
    pObj->AnInheritMethod();
    if (pObj->IsASub())
    {
        B* pObjAsB = static_cast<B*>(pObj);
        pObjAsB->ANonInheritMethod();
    }
}

除了丢失的返回类型之外,我没有看到示例中的代码有任何明显错误;我没有安装Visual C ++ 6来检查。

答案 2 :(得分:1)

您提出的问题与您所包含的代码和错误完全无关。

为了让函数获取A或从A派生的类,它需要做的就是获取A的指针或引用,例如

someFunc(A* pObj, bool someOtherArg);

someFunc(A& obj, bool someOtherArg);

它将通过继承而发挥作用。这就是从彼此派生类的重点。您使用模板编写它的方式,它将与任何类一起使用,该类定义您使用的三种方法,无论它是否来自A

现在您发布的错误与此问题无关,但很奇怪。您发布的代码没有任何问题,但Visual Studio 6是一个古老的编译器;它已有12年历史,并不完全支持现代ISO标准C ++。此错误可能是编译器中的子标准模板实现的工件。