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

时间:2012-07-30 05:02:35

标签: c++ oop

假设我们有:

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

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

myMethod([typei'mlookingfor] c) {}

这样我就可以将Base,A和B传递给myMethod()而不会重载方法? 并使其与引用和指针一起使用?

3 个答案:

答案 0 :(得分:3)

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

答:好的。为什么不呢?

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

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

有用的引用:

  

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

     

多态性 允许程序员只处理派生类成员   喜欢他们的父类成员。更确切地说,多态性   面向对象编程是对象所属的能力   不同的数据类型响应方法调用的方法相同   名称,每一个都根据特定类型的行为而定。

我认为,这正是您所寻找的:)

答案 1 :(得分: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);

答案 2 :(得分:0)

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

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

第二 - 静态多态性:

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