C++多态常见问题

  1. 什么是多态

多态指的是不同类的对象调用同一个方法时做出不同响应的能力

主要是分为两类

一类是编译时多态 也称静态多态 通过函数重载和运算符重载实现

一类是运行时多态 也称动态多态 通过函数重写(覆盖)实现 具体调用时才决定是哪个函数 使用虚函数实现

  1. 什么是重载 重写 重定义

重载指的是在同一个作用域中 函数名相同 但参数列表不同 包括类型\个数\顺序 的函数 返回值不同不算重载 属于静态多态 底层原理是在编译时形成不同的函数名 链接时区分链接

重写指的是在继承关系中子类重新定义继承来的虚函数 重写的函数名\参数列表\返回值类型必须和父类一致 被继承的函数必须是虚函数 可以指定父类显示调用基类的被重写函数 属于动态多态 通过重写子类中的虚函数表实现

重定义指的是在继承关系中 子类重新定义继承来的非虚函数 父类的函数被隐藏 可以使用域作用限定符来访问父类中的同名函数

  1. inline函数可以是虚函数吗

可以 但是inline本身是一个建议的关键字 编译器会忽略inline属性 将其作为虚函数放到虚表中

  1. 静态成员函数可以是虚函数吗

不可以 静态成员函数没有this指针 无法确定属于哪一个对象 也无法访问虚表

  1. 构造函数可以是虚函数吗

不可以 对象中的虚函数表指针在构造函数初始化列表阶段才初始化 如果构造函数是虚函数 那就找不到构造函数了

  1. 析构函数可以是虚函数吗

可以而且在继承关系中最好把析构函数设置成虚函数 因为当使用父类指针或引用管理子类对象时 如果没有设置为虚函数 就只会调用父类的析构函数而不调用子类的析构函数

构造时是先构造父类再构造子类 析构时是先析构子类再析构父类

  1. 虚基表和虚函数表是什么

虚基表是为了解决菱形继承中数据冗余和二义性的问题的

虚函数表是用于覆盖父类的虚函数的

  1. 抽象类是什么 有什么作用

抽象类是包含纯虚函数的类 不能被实例化 只有子类重写了纯虚函数才能实例化 这里体现了接口继承的关系

C++中的多态是通过继承和虚函数实现的,但常见的错误包括: 1. **忘记声明为虚函数**:如果父类中的函数被派生类重写,但在派生类中没有声明为虚函数,那么虽然能调用到正确的函数,但不会实现多态效果。 ```cpp class Base { public: void foo() { /* ... */ } // 忘记声明为虚函数 }; class Derived : public Base { public: // 如果这里不声明为 virtual,就不是多态 void foo() override { /* ... */ } }; ``` 2. **静态绑定(早期绑定)**:如果在基类对象上调用虚函数,使用的是函数在编译时确定的地址,而非运行时的多态行为,这会导致调用错误的函数版本。 3. **忘记继承虚基类**:如果多个派生类都直接或间接地继承自同一个基类,并且这个基类中有一个或多个虚函数,而这些派生类没有共享的公共基类,这时可能会引发错误,因为没有共享的虚表。 4. **动态分配的基类指针调用虚函数**:如果用基类指针动态创建了派生类对象,忘记将指针转换为派生类指针,调用虚函数时会出错,因为基类指针指向的虚函数地址可能不正确。 5. **虚析构函数的滥用**:若不适当使用虚析构函数,可能会导致析构顺序问题,特别是当一个派生类拥有一个指向基类对象的指针时,如果派生类的析构函数不是虚析构,可能导致资源泄漏或其他问题。 为了避免这些错误,确保在定义虚函数时明确标记为`virtual`,处理基类指针时正确转换,以及合理管理继承关系和析构顺序。如果有疑问,可以查阅相关文档或进行测试调试。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

栖林_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值