面试题答案
一键面试函数重载和虚函数在多态机制中的角色
- 函数重载:
- 角色:函数重载是在同一作用域内,函数名相同但参数列表不同(参数个数、类型或顺序不同)的一组函数。它实现的是编译时多态(静态多态),编译器在编译阶段根据函数调用时传入的参数来决定调用哪个重载函数。这使得程序在编译期就确定了执行哪个函数,提高了执行效率。
- 虚函数:
- 角色:虚函数是在基类中声明为
virtual
的成员函数,在派生类中可以被重写。通过基类指针或引用调用虚函数时,会根据指针或引用实际指向的对象类型来决定调用哪个类的虚函数实现,实现运行时多态(动态多态)。这使得程序在运行时根据对象的实际类型来动态绑定函数,增加了程序的灵活性。
- 角色:虚函数是在基类中声明为
具体场景及二者协同工作
- 场景描述:假设有一个图形绘制系统,有基类
Shape
,派生类Circle
和Rectangle
。每个形状都有绘制函数draw
,同时系统还支持不同颜色的绘制。- 定义基类
Shape
:
- 定义基类
class Shape {
public:
virtual void draw() const {
std::cout << "Drawing a shape." << std::endl;
}
void draw(const std::string& color) const {
std::cout << "Drawing a shape with color: " << color << std::endl;
}
};
- 定义派生类
Circle
:
class Circle : public Shape {
public:
void draw() const override {
std::cout << "Drawing a circle." << std::endl;
}
void draw(const std::string& color) const {
std::cout << "Drawing a circle with color: " << color << std::endl;
}
};
- 定义派生类
Rectangle
:
class Rectangle : public Shape {
public:
void draw() const override {
std::cout << "Drawing a rectangle." << std::endl;
}
void draw(const std::string& color) const {
std::cout << "Drawing a rectangle with color: " << color << std::endl;
}
};
- 协同工作及关键作用:
- 函数重载的关键作用:在每个类中,
draw
函数有两个重载版本,一个无参数用于绘制默认颜色的图形,另一个带颜色参数用于绘制指定颜色的图形。这体现了函数重载在编译时根据传入参数不同选择合适函数的功能,使得用户可以方便地选择不同的绘制方式,例如circle.draw()
或circle.draw("red")
。编译器在编译阶段就确定了调用哪个重载函数,提高了效率。 - 虚函数的关键作用:基类
Shape
中的draw
函数(无参数版本)被声明为虚函数,派生类Circle
和Rectangle
重写了这个虚函数。当通过基类指针或引用调用draw
函数时,例如:
- 函数重载的关键作用:在每个类中,
Shape* shape1 = new Circle();
Shape* shape2 = new Rectangle();
shape1->draw();
shape2->draw();
这里会根据指针实际指向的对象类型(Circle
或 Rectangle
)来决定调用哪个类的 draw
函数实现,体现了运行时多态。这样,在程序运行时可以根据对象的实际类型来动态绑定函数,使得系统更加灵活,能够处理不同类型的图形绘制。
通过函数重载和虚函数的协同工作,图形绘制系统既实现了编译时根据参数选择合适函数的高效性,又实现了运行时根据对象类型动态选择函数实现的灵活性,从而实现了复杂的多态功能。