什么是C++中的多态性,如何实现?
C++中的多态性是指同一个接口或函数调用在不同的上下文中表现出不同的行为,是面向对象编程的一个基本特性。多态性主要分为两种类型:编译时多态性和运行时多态性。
1. 编译时多态性
编译时多态性(也称为静态多态性)在编译阶段就可以确定。主要通过函数重载和模板实现。
函数重载:允许定义多个同名函数,只要它们的参数列表不同。例如:
void print(int i) {
std::cout << "整数: " << i << std::endl;
}
void print(double d) {
std::cout << "浮点数: " << d << std::endl;
}
void print(std::string s) {
std::cout << "字符串: " << s << std::endl;
}
模板:允许编写与类型无关的代码,从而在编译时实现多态性。例如:
template <typename T>
T add(T a, T b) {
return a + b;
}
2. 运行时多态性
运行时多态性(也称为动态多态性)是在程序运行时才确定。主要通过继承和虚函数实现。
继承和虚函数:基类指针或引用指向派生类对象,并通过虚函数表(vtable)调用对象的函数。在基类中定义一个虚函数,并在派生类中覆盖它。例如:
class Shape {
public:
virtual void draw() const {
std::cout << "Drawing Shape" << std::endl;
}
};
class Circle : public Shape {
public:
void draw() const override {
std::cout << "Drawing Circle" << std::endl;
}
};
class Square : public Shape {
public:
void draw() const override {
std::cout << "Drawing Square" << std::endl;
}
};
void render(const Shape& shape) {
shape.draw();
}
int main() {
Circle circle;
Square square;
render(circle); // 输出: Drawing Circle
render(square); // 输出: Drawing Square
return 0;
}
在这个示例中,render
函数接受一个Shape
引用,不过由于draw
函数是虚函数,根据传入对象的具体类型,调用了Circle
或Square
类的draw
方法。这种动态绑定确保了程序在运行时选择合适的函数实现。