C++ 从 0 入门(四)|继承、多态、this 指针、深浅拷贝(C++ 面试终极收官)

张开发
2026/4/18 0:20:47 15 分钟阅读

分享文章

C++ 从 0 入门(四)|继承、多态、this 指针、深浅拷贝(C++ 面试终极收官)
大家好我是网域小星球。本篇是 C 面试核心最后一篇覆盖继承、多态、this 指针、深浅拷贝、三大特性全部是 C 开发岗必问手撕考点。学完这 4 篇足以应对 C 初试、笔试、基础面试提问代码可直接在 VS2022 运行。目录一、本章学习目标二、this 指针面试高频基础1. 核心概念2. 代码示例面试常问三、继承C 三大特性之二1. 继承作用2. 继承语法3. 公有继承代码示例4. 继承访问权限规则面试必背5. 构造与析构继承顺序四、浅拷贝 深拷贝面试超级高频1. 浅拷贝2. 深拷贝完整对比代码面试标准答案五、多态 虚函数C 最难、面试必问1. 多态概念2. 实现多态三个条件3. 虚函数 多态完整示例4. 虚析构函数面试大坑六、C 三大特性 面试简答背诵版七、C 开发岗 高频简答汇总直接背八、本篇总结一、本章学习目标掌握 C 三大特性封装、继承、多态完整概念吃透继承语法、访问控制、菱形继承问题理解this 指针面试常考原理分清浅拷贝 深拷贝内存泄漏高频题掌握多态、虚函数核心原理与代码二、this 指针面试高频基础1. 核心概念this是成员函数隐含指针指向当前调用该函数的对象。每个非静态成员函数都自带一个this形参作用区分成员变量和局部同名变量、返回当前对象、操作自身成员2. 代码示例#include iostream #include string using namespace std; class Person { public: string name; int age; Person(string name, int age) { // this-name 代表成员变量 this-name name; this-age age; } void show() { cout this-name this-age endl; } }; int main() { Person p(李四, 18); p.show(); return 0; }面试常问this 指针存放在哪里答栈区作为成员函数隐式形参传入。this 可以为空吗答可以空 this 调用函数不崩溃只要不解引用成员。三、继承C 三大特性之二1. 继承作用复用代码、减少冗余、实现层级设计子类复用父类成员与方法。2. 继承语法class 子类 : 继承方式 父类 { // 子类独有成员 };三种继承方式public公有继承最常用protected保护继承private私有继承3. 公有继承代码示例// 父类 class Animal { public: void eat() { cout 动物需要进食 endl; } }; // 子类 公有继承 class Dog : public Animal { public: void bark() { cout 狗狗汪汪叫 endl; } }; int main() { Dog d; d.eat(); // 继承父类 d.bark(); // 自己独有 return 0; }4. 继承访问权限规则面试必背父类public→ 子类public父类protected→ 子类protected父类private→ 子类不可访问5. 构造与析构继承顺序构造先父类后子类析构先子类后父类四、浅拷贝 深拷贝面试超级高频1. 浅拷贝编译器默认拷贝构造只拷贝地址不拷贝堆内存内容。多个对象共用同一块堆空间析构时重复释放内存 → 程序崩溃2. 深拷贝手动写拷贝构造重新开辟堆内存每个对象独立资源。完整对比代码class Student { public: char* msg; // 构造堆内存申请 Student() { msg new char[20]; } // 浅拷贝默认 //Student(const Student s) default; // 深拷贝手写 Student(const Student s) { msg new char[20]; // 重新开空间 strcpy(msg, s.msg); } ~Student() { delete[] msg; } };面试标准答案浅拷贝只拷贝指针地址资源共享容易重复释放内存。深拷贝开辟新内存资源独立避免内存泄漏与崩溃。五、多态 虚函数C 最难、面试必问1. 多态概念一个接口多种实现父类指针 / 引用 指向子类对象调用虚函数执行子类重写逻辑。2. 实现多态三个条件必须有继承父类函数加virtual虚函数父类指针 / 引用 指向子类3. 虚函数 多态完整示例#include iostream using namespace std; class Animal { public: // 虚函数 virtual void speak() { cout 动物发声 endl; } }; class Cat : public Animal { public: // 重写 void speak() override { cout 猫咪喵喵叫 endl; } }; class Dog : public Animal { public: void speak() override { cout 狗狗汪汪叫 endl; } }; // 多态接口 void test(Animal a) { a.speak(); } int main() { Cat c; Dog d; test(c); test(d); return 0; }运行结果猫咪喵喵叫 狗狗汪汪叫4. 虚析构函数面试大坑父类析构必须加virtual否则子类析构不执行内存泄漏。virtual ~Animal(){}六、C 三大特性 面试简答背诵版封装将属性私有化对外提供接口隐藏实现细节提高安全性。继承子类复用父类代码降低冗余实现代码复用。多态父类引用指向子类统一接口、不同实现提高扩展性。七、C 开发岗 高频简答汇总直接背引用和指针区别重载和重写区别浅拷贝深拷贝区别多态实现原理虚函数作用构造、析构能否为虚函数this 指针是什么1. 引用 和 指针 的区别引用是变量别名无独立内存指针是独立变量存储地址占用空间。引用必须初始化且不可变更指向指针可以不初始化、可随意改指向。无空引用存在空指针、野指针。引用更安全简洁指针更灵活可用于跨函数修改、动态内存。引用底层依旧是指针但语法层面屏蔽了风险。2. 重载 和 重写覆盖区别重载overload同一作用域、函数名相同、参数列表不同编译期绑定与返回值无关属于静态多态重写override发生在继承关系中子类重写父类virtual 虚函数函数名、参数、返回值完全一致运行时绑定实现动态多态3. 浅拷贝 与 深拷贝 区别浅拷贝只拷贝指针地址堆内存资源共享析构重复释放导致崩溃。深拷贝手动开辟新堆空间拷贝内容每个对象资源独立。类中有new动态成员时必须自己实现深拷贝。4. 多态的实现原理必须满足三大条件继承 虚函数 父类指针 / 引用指向子类含有虚函数的类会生成虚函数表 (vtable)对象内存在虚表指针 (vptr)程序运行时通过 vptr 查找虚表调用子类重写的函数实现运行时多态5. 虚函数作用实现多态父类统一接口子类不同实现。继承场景中通过父类指针正确调用子类方法。虚析构保证子类析构函数正常执行避免内存泄漏。6. this 指针是什么this 指针是非静态成员函数的隐含形参。指向当前正在调用成员函数的对象。用于区分局部变量与成员变量、返回当前对象。存放于栈上由编译器自动传递。7. 构造函数、析构函数 能否是虚函数① 构造函数不能是虚函数原因虚函数依赖虚表指针 vptr。vptr 在构造函数执行完毕后才会初始化。构造阶段对象还未完整创建没有虚表无法实现虚函数调用。② 析构函数可以是虚函数并且建议写为虚析构场景当父类指针指向子类对象时如果析构非虚 → 只调用父类析构子类资源不释放内存泄漏如果析构为虚 → 触发多态先析构子类再析构父类八、本篇总结this 指针是对象内置隐式指针解决成员同名问题继承实现代码复用必须注意构造析构顺序浅拷贝共享堆内存会崩溃深拷贝手动开空间虚函数 继承 父类指针 多态虚析构防止继承场景内存泄漏

更多文章