面试题答案
一键面试- 纯虚函数的定义方式:
纯虚函数是在基类中声明的虚函数,它在基类中没有定义具体的实现,要求任何派生类都必须定义自己的实现版本。定义方式为在虚函数声明的结尾加上
= 0
。例如:
virtual void function() = 0;
- 基于纯虚函数创建抽象类: 当一个类至少包含一个纯虚函数时,这个类就成为抽象类。抽象类不能被实例化,主要用于为派生类提供一个通用的接口。
- 代码示例(图形绘制基类设计):
#include <iostream>
// 抽象基类 Shape
class Shape {
public:
// 纯虚函数,用于绘制图形
virtual void draw() = 0;
// 纯虚函数,用于计算面积
virtual double area() = 0;
};
// 派生类 Circle
class Circle : public Shape {
private:
double radius;
public:
Circle(double r) : radius(r) {}
// 实现 draw 函数
void draw() override {
std::cout << "Drawing a Circle with radius " << radius << std::endl;
}
// 实现 area 函数
double area() override {
return 3.14159 * radius * radius;
}
};
// 派生类 Rectangle
class Rectangle : public Shape {
private:
double width;
double height;
public:
Rectangle(double w, double h) : width(w), height(h) {}
// 实现 draw 函数
void draw() override {
std::cout << "Drawing a Rectangle with width " << width << " and height " << height << std::endl;
}
// 实现 area 函数
double area() override {
return width * height;
}
};
int main() {
// Shape s; // 错误,抽象类不能实例化
Shape* shapes[2];
shapes[0] = new Circle(5);
shapes[1] = new Rectangle(4, 6);
for (int i = 0; i < 2; ++i) {
shapes[i]->draw();
std::cout << "Area: " << shapes[i]->area() << std::endl;
delete shapes[i];
}
return 0;
}
在上述示例中,Shape
类是一个抽象类,包含两个纯虚函数 draw
和 area
。Circle
和 Rectangle
类继承自 Shape
类,并实现了这些纯虚函数。在 main
函数中,通过抽象类指针数组来调用不同派生类的 draw
和 area
函数,展示了多态性。