面试题答案
一键面试- 纯虚函数与接口设计实现多态性的原理:
- 在C++中,纯虚函数是一种特殊的虚函数,它在基类中只声明而不定义,其语法形式为在虚函数声明后加上
= 0
。 - 包含纯虚函数的类被称为抽象类,抽象类不能实例化对象。
- 接口设计通常是通过抽象类来实现的,抽象类定义了一组纯虚函数,这些纯虚函数就是接口的规范。
- 派生类继承抽象类后,必须实现抽象类中的所有纯虚函数,否则派生类也将成为抽象类。
- 当通过基类指针或引用调用这些纯虚函数时,C++的动态绑定机制会根据对象的实际类型来调用相应派生类的实现,从而实现多态性。
- 在C++中,纯虚函数是一种特殊的虚函数,它在基类中只声明而不定义,其语法形式为在虚函数声明后加上
- 代码示例:
#include <iostream>
// 抽象基类,定义接口
class Shape {
public:
// 纯虚函数,计算面积
virtual double area() const = 0;
// 纯虚函数,绘制图形
virtual void draw() const = 0;
};
// 派生类,继承自Shape
class Circle : public Shape {
private:
double radius;
public:
Circle(double r) : radius(r) {}
// 实现基类的纯虚函数,计算圆的面积
double area() const override {
return 3.14159 * radius * radius;
}
// 实现基类的纯虚函数,绘制圆
void draw() const override {
std::cout << "Drawing a circle." << std::endl;
}
};
// 派生类,继承自Shape
class Rectangle : public Shape {
private:
double width;
double height;
public:
Rectangle(double w, double h) : width(w), height(h) {}
// 实现基类的纯虚函数,计算矩形的面积
double area() const override {
return width * height;
}
// 实现基类的纯虚函数,绘制矩形
void draw() const override {
std::cout << "Drawing a rectangle." << std::endl;
}
};
int main() {
// 创建Shape类型的指针数组
Shape* shapes[2];
shapes[0] = new Circle(5.0);
shapes[1] = new Rectangle(4.0, 3.0);
// 通过基类指针调用派生类的函数,实现多态
for (int i = 0; i < 2; ++i) {
std::cout << "Area of shape " << i + 1 << " is: " << shapes[i]->area() << std::endl;
shapes[i]->draw();
delete shapes[i];
}
return 0;
}
在上述代码中,Shape
类是一个抽象类,包含两个纯虚函数 area
和 draw
,这两个函数定义了形状相关操作的接口。Circle
和 Rectangle
类继承自 Shape
类,并实现了这些纯虚函数。在 main
函数中,通过 Shape
类型的指针数组来存储不同派生类对象的指针,当调用 area
和 draw
函数时,会根据指针实际指向的对象类型(Circle
或 Rectangle
)来调用相应的函数实现,从而展示了多态性。