[面经] 访问C++虚函数表

本文通过一个具体的C++程序示例,展示了虚函数表的工作原理。从类A继承到类C的过程中,详细分析了每个类的虚函数及其在内存中的布局情况。通过遍历虚函数表并调用所有虚函数,直观地展示了不同类对象如何实现多态行为。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <cstdio>

class A
{
public:
    virtual void a(void)
    {
        printf("A:a(%p)\n", this);
    }

private:
    virtual void b(void)
    {
        printf("A:b(%p)\n", this);
    }
};

class B : public A
{
public:
    virtual void c(void)
    {
        printf("B:c(%p)\n", this);
    }

private:
    virtual void d(void)
    {
        printf("B:d(%p)\n", this);
    }
};

class C : public B
{
public:
    virtual void e(void)
    {
        printf("C:e(%p)\n", this);
    }

private:
    virtual void f(void)
    {
        printf("C:f(%p)\n", this);
    }
};

int main(void)
{
    A a;
    B b;
    C c;
    // void ***ppp_avf = (void ***)&a;
    void ***ppp_bvf = (void ***)&b;
    void ***ppp_cvf = (void ***)&c;

    printf("a, b, c: %p, %p, %p\n", &a, &b, &c);

    // for (int i = 0; NULL != (*ppp_avf)[i]; ++i) {
    //     ((void (*)(void))(*ppp_avf)[i])();
    // }
    // printf("\n");

    for (int i = 0; NULL != (*ppp_bvf)[i]; ++i) {
        ((void (*)(void *))(*ppp_bvf)[i])(&b);
    }
    printf("\n");

    for (int i = 0; NULL != (*ppp_cvf)[i]; ++i) {
        ((void (*)(void *))(*ppp_cvf)[i])(&c);
    }
    printf("\n");

    return 0;
}

### 关于C++保研试的经验 #### 试中的编程能力展示 在保研试中,尤其是涉及计算机科学领域时,掌握一门高效的编程语言至关重要。推荐使用C和C++进行练习[^1]。LeetCode是一个很好的平台,在这里可以找到大量的题目用于提高解题速度和质量。 #### 虚函数与纯虚函数的理解 当被问到`C++虚函数和纯虚函数的区别`这类问题时,应当清楚地解释:虚函数允许派生类重定义基类成员函数的行为;而纯虚函数不仅具有此特性,还强制要求任何继承自含有纯虚函数的类都必须实现该函数,除非它们本身也被声明为抽象类[^10]。 #### Java与C++概念对比 对于像`Java里对应C++虚函数的是什么`这样的跨语言知识点,则应回答接口中的默认方法或抽象类里的未具体化的方法可视为等效物[^11]。 #### 编程实践的重要性 除了理论知识外,实际动手编写代码同样重要。能够熟练运用STL标准模板库解决问题,并理解其内部机制如红黑树、哈希表等数据结构的工作原理将会给评委留下深刻印象。 #### 数学基础知识的应用 针对特定的技术性问题,比如`矩阵求逆的时间复杂度`,应该给出O(n^3)作为一般情况下的估计值,这基于高斯消元法或其他相似算法的操作次数分析得出的结果[^12]。 #### 计算机学科核心课程复习 最后但并非最不重要的部分是准备好回答有关计算机体系结构、操作系统、编译原理等方的基础知识提问。这些都是构建扎实专业知识不可或缺的内容[^3]。 ```cpp // 示例:简单的C++程序展示了如何定义和使用虚函数以及纯虚函数 #include <iostream> using namespace std; class Base { public: virtual void show() { cout << "Base class"; } // 定义了一个普通的虚函数 }; class Derived : public Base { public: void show() override { cout << "Derived class"; } // 重写了父类的show() }; class AbstractClass { public: virtual void pure_virtual_function() = 0; // 这里定义了一个纯虚函数 }; int main(){ Base b; Derived d; b.show(); // 输出:"Base class" d.show(); // 输出:"Derived class" return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值