面试题答案
一键面试定义区别
- 虚函数:在基类中使用
virtual
关键字声明的成员函数,在派生类中可以被重写(override)。虚函数在基类中有具体的函数实现。例如:
class Base {
public:
virtual void func() {
std::cout << "Base::func" << std::endl;
}
};
- 纯虚函数:也是在基类中使用
virtual
关键字声明,但在声明语句后加上= 0
,表示该函数没有具体的实现,必须在派生类中被重写。例如:
class Base {
public:
virtual void func() = 0;
};
作用区别
- 虚函数:实现多态性,通过基类指针或引用调用派生类中重写的函数版本。使得程序在运行时能够根据对象的实际类型来决定调用哪个函数,而不是根据指针或引用的静态类型。
- 纯虚函数:定义一个接口规范,强制派生类必须提供该函数的具体实现。含有纯虚函数的类是抽象类,不能被实例化,主要目的是为派生类提供一个通用的接口框架。
应用场景区别
- 虚函数应用场景:当基类有一些通用的行为实现,但派生类可能需要根据自身特点对该行为进行一些调整时,使用虚函数。比如图形绘制类:
class Shape {
public:
virtual void draw() {
std::cout << "Drawing a shape" << std::endl;
}
};
class Circle : public Shape {
public:
void draw() override {
std::cout << "Drawing a circle" << std::endl;
}
};
class Rectangle : public Shape {
public:
void draw() override {
std::cout << "Drawing a rectangle" << std::endl;
}
};
int main() {
Shape* shape1 = new Circle();
Shape* shape2 = new Rectangle();
shape1->draw();
shape2->draw();
delete shape1;
delete shape2;
return 0;
}
这里 Shape
类的 draw
函数定义了基本的绘制行为,Circle
和 Rectangle
类根据自身需求重写 draw
函数。
2. 纯虚函数应用场景:当基类无法为某些函数提供有意义的默认实现,且所有派生类都必须实现这些函数时,使用纯虚函数。例如几何图形计算面积:
class Shape {
public:
virtual double area() = 0;
};
class Circle : public Shape {
private:
double radius;
public:
Circle(double r) : radius(r) {}
double area() override {
return 3.14159 * radius * radius;
}
};
class Rectangle : public Shape {
private:
double width;
double height;
public:
Rectangle(double w, double h) : width(w), height(h) {}
double area() override {
return width * height;
}
};
Shape
类作为抽象基类,定义了 area
纯虚函数,Circle
和 Rectangle
类必须实现 area
函数来计算各自的面积。