2

假设我们有:

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

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

myMethod([typei'mlookingfor] c) {}

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

4

3 回答 3

3

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

答:当然。为什么不?

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

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

有用的报价:

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

多态性允许程序员像对待父类的成员一样对待派生类成员。更准确地说,面向对象编程中的多态性是属于不同数据类型的对象响应同名方法的方法调用的能力,每个方法调用都根据适当的特定于类型的行为。

我相信,这正是您正在寻找的:)

于 2012-07-30T05:05:21.593 回答
3

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

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);
于 2012-07-30T05:08:45.073 回答
0

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

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

2nd - 静态多态:

template<class T>
std::enable_if<is_base_of<Base,T>::value>
myMethod(base x) {...}   
于 2012-07-30T05:29:47.010 回答