MST

星途 面试题库

面试题:C++对象多态性对程序结构的影响

在C++中,多态性通过虚函数和指针或引用实现。请举例说明多态性如何影响程序结构,特别是在类继承体系下,不同派生类对象通过基类指针或引用调用虚函数时,程序结构在运行时和编译时有哪些变化。
16.4万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试

多态性对程序结构的影响

  1. 编译时
    • 在编译阶段,编译器根据指针或引用的静态类型(即声明时的类型)来确定可调用的函数集合。例如,有一个基类Base和派生类Derived,若有Base* ptr;,编译器会查找Base类中定义的函数(包括虚函数),对于虚函数,编译器会为其生成虚函数表指针(vptr)相关的信息,用于运行时动态绑定。
    • 示例代码如下:
#include <iostream>
class Base {
public:
    virtual void print() {
        std::cout << "Base::print()" << std::endl;
    }
};
class Derived : public Base {
public:
    void print() override {
        std::cout << "Derived::print()" << std::endl;
    }
};
  • 在编译这段代码时,编译器会为Base类生成虚函数表,其中包含print函数的地址,Derived类也会有自己的虚函数表,并且会覆盖Base类虚函数表中print函数的地址为Derived::print的地址。
  1. 运行时
    • 在运行时,程序根据指针或引用所指向对象的实际类型(动态类型)来决定调用哪个虚函数的实现。这就是动态绑定。
    • 继续上面的示例,当执行以下代码时:
int main() {
    Base* basePtr = new Derived();
    basePtr->print();
    delete basePtr;
    return 0;
}
  • 在运行basePtr->print();时,程序会根据basePtr所指向的实际对象(Derived类型的对象),通过虚函数表找到Derived::print函数并调用,输出Derived::print()。这体现了多态性使得程序在运行时能够根据对象的实际类型做出不同的行为,从而增强了程序的灵活性和可扩展性。例如在大型软件系统中,如果有一个处理图形的类继承体系,基类Shape有虚函数draw,不同的派生类CircleRectangle等重写draw函数,通过基类指针或引用就可以在运行时根据实际的图形对象类型调用相应的draw函数,而不需要在编译时就确定具体的图形类型,使得代码结构更加清晰,易于维护和扩展新的图形类型。