核心在于用父类类型声明参数,实参传任意子类对象——只要满足继承+重写+向上转型三个条件,就能自然实现统一入参。

明确方法形参类型为父类或接口
这是多态入参的第一步。方法不针对具体子类设计,而是面向抽象:
- Java中写成 void process(Animal a) 或 void draw(Drawable d)
- C++中写成 void render(const Shape& s) 或 void handle(Base* obj)
- 避免使用具体子类如
process(Dog d)或process(Cat c),否则每新增一个子类就得重载一次方法
确保子类正确重写父类/接口中的方法
多态行为的实质是运行时动态绑定,前提是子类提供了自己的实现:
- Java:子类必须 重写(override) 父类的非private、非static、非final方法;接口实现类必须实现所有抽象方法
- C++:基类中对应函数需声明为 virtual,子类中建议显式加 override 关键字
- 例如:
Animal.eat()被Dog.eat()和Cat.eat()分别覆盖,调用process(new Dog())就会执行狗的吃逻辑
调用时直接传入子类实例(自动向上转型)
无需强制转换,编译器允许子类对象赋值给父类引用:
- Java示例:
process(new Dog())、process(new Cat())、process(new Bird())全部合法 - C++示例:
render(circle)、render(rectangle),其中circle是Circle类型对象,rectangle是Rectangle类型对象 - 关键点:传的是对象本身(或其地址/引用),不是类型名;运行时根据实际对象类型决定调用哪个版本的方法
搭配集合批量处理更显优势
当需要统一处理多个不同子类对象时,把它们装进父类/接口类型的集合里:
- Java:
List<animal> animals = Arrays.asList(new Dog(), new Cat(), new Duck());</animal>
然后遍历:for (Animal a : animals) { a.eat(); } - C++:
std::vector<:unique_ptr>> shapes;</:unique_ptr>
添加:shapes.push_back(std::make_unique<circle>());</circle>
调用:for (const auto& s : shapes) s->draw(); - 新增子类(如
Fish)时,原有处理逻辑完全不用改,只需让Fish继承Animal并重写eat()











