多态相关

//ychw365 Test  polymorphism 
#include "stdafx.h"
#include <iostream>
using namespace std;
class CBase{
public:
    CBase(){
        cout<<"CB C"<<endl;
    }
    virtual ~CBase(){
        cout<<"CB D"<<endl;
    }
};
class CDerived :public CBase{
public:
    CDerived(){
        cout<<"CD C"<<endl;
    }
    ~CDerived(){
        cout<<"CD D"<<endl;
    }
};
main(){
    CDerived a;
    CBase *p=&a;
    CBase *q=new CDerived; 
    delete q;
}


 
<think>好的,我需要处理用户关于C++多态的笔试题的查询。首先,用户提供了四个引用内容,其中包含不同的代码示例和问题。我需要分析这些引用,找出与C++多态相关的关键点,并生成相关问题。 首先,引用[1]讨论了解构函数未重写的问题,导致派生类的析构函数未被调用,可能引发资源泄漏。这涉及到虚析构函数的重要性。 引用[2]和[3]是关于虚函数默认参数的问题。在C++中,虚函数的默认参数是静态绑定的,因此当通过基类指针调用派生类函数时,使用的默认参数来自基类。这可能导致输出与预期不符,如问题中的答案B显示。 引用[4]展示了构造函数中虚函数调用的风险。由于在基类构造函数期间,派生类尚未初始化,虚函数表指针可能指向基类的虚函数表,导致调用基类的虚函数而非派生类的。 接下来,我需要根据这些内容生成相关问题。问题应覆盖虚析构函数、默认参数的静态绑定、构造函数中的虚函数调用,以及虚函数表机制。同时,要确保问题符合用户要求,与多态相关,并基于提供的引用内容。 最后,需要检查生成的问题是否清晰,是否覆盖了各个关键点,并且没有超出引用范围。确保问题能够帮助用户深入理解C++多态的不同方面。</think>### C++多态编程笔试题解析 #### 1. 虚析构函数的重要性 当基类指针指向派生类对象时,若基类析构函数未声明为虚函数,`delete`操作仅调用基类析构函数,导致派生类析构函数未被调用,可能引发资源泄漏[^1]。 **示例代码问题点**: ```cpp Person* p1 = new Student; delete p1; // 仅输出~Person() ``` **解决方法**:将基类析构函数声明为`virtual`: ```cpp virtual ~Person() { ... } ``` #### 2. 虚函数默认参数的静态绑定特性 虚函数的多态性**仅作用于函数体**,默认参数值在编译期根据指针类型静态确定[^2][^3]。 **示例分析**: ```cpp B* p = new B; p->test(); // 调用A::test(),实际执行B::func(val=1) ``` **输出结果**:`B->1`。原因:`test()`在基类A中定义,其调用`func()`时使用A的默认参数`val=1`,但实际调用派生类B的`func()`实现。 #### 3. 构造函数中调用虚函数的风险 在构造函数执行期间,虚函数表指针(vptr)尚未指向派生类的虚函数表,因此虚函数调用不会触发多态[^4]。 **代码示例**: ```cpp Base() { clear(); // 清空虚函数表指针 show(); // 调用Base::show() } ``` **关键结论**:构造函数中调用虚函数会直接执行当前类的实现,无法实现动态绑定。 #### 4. 虚函数表(vtable)机制 虚函数通过虚函数表实现动态绑定。对象内存布局首地址存储虚函数表指针,指向类的虚函数地址列表[^4]。 **内存布局示例**: ```cpp Derive obj; // 内存结构:vfptr -> &Derive::vftable ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值