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

是否可以将方法参数的类型定义为类或任何派生类?

  •  2
  • sh03  · 技术社区  · 13 年前

    假设我们已经:

    class Base {...}
    class A : public Base {...}
    class B : public Base {...}
    

    是否可以将泛型方法的参数类型设置为:

    myMethod([typei'mlookingfor] c) {}
    

    这样我就可以把基地、A和B传给 myMethod() 而不使方法过载? 并使其与引用和指针一起工作?

    3 回复  |  直到 5 年前
        1
  •  3
  •   Luchian Grigore sgryzko    13 年前

    如果对基类的指针或引用对您有效,只需使用它:

    void myMethod(Base& c) {}
    A a;
    B b;
    myMethod(a);  //OK
    myMethod(b);  //OK
    

    请注意,您必须使用引用或指针来防止 对象切割 .如果方法是 myMethod(Base c) ,将丢失派生对象的类型信息。

    如果没有,可以使用模板

    template<typename T>
    void myMethod(T& c)
    {
    }
    A a;
    B b;
    myMethod(a);
    myMethod(b);
    
        2
  •  3
  •   paulsm4    13 年前

    Q: 是否可以将方法参数的类型定义为类或任何派生类?

    A: 当然。为什么不呢?

    如果您想要一个可以是任意类型的“泛型”参数,只需使用模板即可。

    否则,如果您想要“类或任何子类”,只需使用基类。

    有用的引用:

    http://wiki.answers.com/Q/What_are_the_concepts_of_object_oriented_programming

    多态性 允许程序员仅处理派生类成员 就像他们的父类成员一样。更确切地说 面向对象编程是指对象属于 不同的数据类型以响应相同方法的方法调用 名称,每一个都根据适当的特定类型的行为。

    我相信,这正是你想要的:)

        3
  •  0
  •   Leonid Volnitsky    13 年前

    有两种方法可以做到这一点。第一是动态多态性。仅适用于指针和引用。运行时开销较小:

    void myMethod(Base& x) { ...}
    

    第二-静态多莫菲sm:

    template<class T>
    std::enable_if<is_base_of<Base,T>::value>
    myMethod(base x) {...}