C++父类析构中调用的虚函数,子类重写虚函数,最后调用的是谁的虚函数
时间: 2024-05-20 21:13:32 浏览: 12
在C++中,当一个类中定义了虚函数,如果该类有子类继承它并且重写了该虚函数,那么在使用子类对象时,调用该虚函数会优先调用子类重写的虚函数。
对于析构函数,如果父类中定义了虚析构函数,那么在使用子类对象时,会先调用子类的析构函数,然后再调用父类的析构函数。如果子类没有定义析构函数,那么会直接调用父类的析构函数。
因此,在父类析构函数中调用虚函数时,如果子类重写了该虚函数,最后调用的就是子类重写的虚函数。
相关问题
c++父类非虚函数,想在子类中实现新的功能
如果想要在子类中实现新的功能,建议使用虚函数来实现,而不是重新定义继承而来的非虚函数。虚函数可以在派生类中进行重写,从而实现新的功能,而不会影响到基类的实现。
具体实现方法如下:
1. 在父类中声明虚函数。
2. 在子类中重写虚函数,实现新的功能。
3. 在需要调用子类实现的地方,使用指向子类对象的指针或引用来调用虚函数。
示例代码如下:
```c++
#include <iostream>
using namespace std;
class Parent {
public:
void print() {
cout << "Parent::print()" << endl;
}
virtual void show() {
cout << "Parent::show()" << endl;
}
};
class Child : public Parent {
public:
void print() {
cout << "Child::print()" << endl;
}
void show() override {
cout << "Child::show()" << endl;
}
};
int main() {
Parent *p = new Child;
p->print(); // 调用父类的print函数
p->show(); // 调用子类的show函数
return 0;
}
```
输出结果为:
```
Parent::print()
Child::show()
```
可以看到,当使用指向子类对象的指针调用print函数时,调用的是父类的print函数,而使用同样的指针调用show函数时,调用的是子类的show函数。这就是虚函数的实现方式。
子类调用父类的虚函数
子类调用父类的虚函数时,可以通过父类指针或引用来调用。当父类指针或引用指向父类对象时,调用的是父类的虚函数。当父类指针或引用指向子类对象时,调用的是子类重写的虚函数。这是因为虚函数通过虚函数表来实现多态性,虚函数表中存储了每个类的虚函数地址,通过指针或引用调用虚函数时,会根据指针或引用的实际类型来查找对应的虚函数地址并调用。所以子类调用父类的虚函数时,会根据实际类型来调用对应的虚函数。
#### 引用[.reference_title]
- *1* *2* *3* [C++多态的理解](https://blog.csdn.net/weixin_53831496/article/details/121021575)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item]
[ .reference_list ]