代码之家  ›  专栏  ›  技术社区  ›  Mark

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

  •  0
  • Mark  · 技术社区  · 14 年前

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

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

    error C2065: 'pObj' : undeclared identifier
    

    我离基地太远了吗?

    3 回复  |  直到 14 年前
        1
  •  2
  •   James McNellis    14 年前

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

    除了丢失的返回类型,我没有看到任何明显错误的代码在您的例子中,我没有VisualC++ 6安装检查。

        2
  •  2
  •   Alexandre C.    14 年前

    你不需要模板,这是多态性的免费行为。

    编辑:如果你写的是:

    if (pObj->IsASub())
    

    那你的设计可能有问题。该方法应该适用于派生链中的任何类型。

        3
  •  1
  •   Tyler McHenry    14 年前

    你问的问题与你包含的代码和错误完全无关。

    A A A ,例如。

    someFunc(A* pObj, bool someOtherArg);
    

    someFunc(A& obj, bool someOtherArg);
    

    任何 类,该类定义您使用的三个方法,无论它是否从 .

    现在你发布的错误与这个问题无关,但很奇怪。您发布的代码没有错,但是VisualStudio 6是一个古老的编译器;它已经十二年了,并没有完全支持现代ISO标准C++。此错误可能是编译器中的次标准模板实现的产物。