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

Is it possible to define the type of a method argument to be a class or any derivate class?

本文关键字:定义 派生 任何 类型 方法 参数 是否      更新时间:2023-10-16

假设我们有:

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

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

myMethod([typei'mlookingfor] c) {}

以便我可以在不重载方法的情况下将Base、A和B传递给myMethod()?并使其与引用和指针一起工作?

如果对基类的指针或引用适用,只需使用:

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

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

A: 当然。为什么不呢?

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

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

有用的报价:

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

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

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

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

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

第二种-静态多模式:

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