面试题答案
一键面试#include <iostream>
class Shape {
public:
virtual void draw() const {
std::cout << "Drawing a shape." << std::endl;
}
};
class Circle : public Shape {
public:
void draw() const override {
std::cout << "Drawing a circle." << std::endl;
}
};
class Rectangle : public Shape {
public:
void draw() const override {
std::cout << "Drawing a rectangle." << std::endl;
}
};
int main() {
Shape* shapePtr;
Circle circle;
Rectangle rectangle;
shapePtr = &circle;
shapePtr->draw();
shapePtr = &rectangle;
shapePtr->draw();
Shape& shapeRef = circle;
shapeRef.draw();
Shape& shapeRef2 = rectangle;
shapeRef2.draw();
return 0;
}
虚函数和指针/引用对于多态的必要性解释:
- 虚函数:虚函数在基类中声明,子类可以重写(override)这些函数。虚函数使得编译器能够在运行时根据对象的实际类型来决定调用哪个函数版本,而不是在编译时就确定。如果没有虚函数机制,函数调用将根据指针或引用的静态类型来决定,无法实现运行时多态。
- 指针或引用:使用指针或引用指向不同派生类对象,通过它们来调用虚函数。由于指针或引用可以指向不同类型的对象(基类指针或引用可以指向派生类对象),在运行时根据所指对象的实际类型,调用相应的虚函数实现。如果直接使用对象调用函数,函数调用将在编译时根据对象的静态类型确定,不会体现多态性。
因此,虚函数和指针/引用这两个要素共同作用,实现了C++中的运行时多态性。