子类访问父类成员函数问题:C++排序类继承场景求助
调用父类
runOnce函数的两种场景解决方案 看起来你已经用多态方式创建了子类对象(通过父类指针指向),要访问父类的runOnce函数,分两种常见场景处理:
场景1:子类没有重写runOnce,或父类的runOnce不是虚函数
这种情况下,直接通过父类指针调用就会默认执行父类的runOnce实现——因为C++的静态绑定规则,只要子类没重写这个函数,调用时会直接匹配父类版本:
// 直接调用父类runOnce bubble->runOnce(); quick->runOnce(); merge->runOnce();
场景2:子类重写了runOnce(父类中它是虚函数),但需要强制调用父类版本
如果你的子类已经重写了runOnce(比如为了实现自己的排序逻辑),但偶尔需要调用父类的原始实现,就得用**作用域解析符::**明确指定调用父类的函数:
// 明确调用Sorter<int>父类的runOnce bubble->Sorter<int>::runOnce(); quick->Sorter<int>::runOnce(); merge->Sorter<int>::runOnce();
额外注意事项
- 权限检查:确保父类的
runOnce是public或protected权限,如果是private,外部代码和子类都无法访问,得调整父类的访问修饰符。 - 内存安全:你用
new创建了子类对象,记得在程序结束前用delete释放这些指针避免内存泄漏。更推荐用智能指针(比如std::unique_ptr)自动管理内存:std::unique_ptr<Sorter<int>> bubble = std::make_unique<BubbleSort<int>>(); - 子类内部调用:如果是在子类成员函数里调用父类的
runOnce,直接写Sorter<T>::runOnce();即可(T是你的模板参数)。
举个完整示例参考(包含父类、子类和main函数的完整逻辑):
#include <iostream> #include <vector> #include <fstream> #include <memory> template <typename T> class Sorter { public: virtual void runOnce() { std::cout << "Parent Sorter's runOnce executed\n"; } }; template <typename T> class BubbleSort : public Sorter<T> { public: void runOnce() override { std::cout << "BubbleSort's runOnce executed\n"; } }; int main() { std::fstream Data; Data.open("Test.txt", std::ios::in | std::ios::out); std::unique_ptr<Sorter<int>> bubble = std::make_unique<BubbleSort<int>>(); // 调用父类版本 bubble->Sorter<int>::runOnce(); // 调用子类版本 bubble->runOnce(); std::vector<int> list; int temp; while (Data >> temp) { // 替换!Data.eof()的写法,避免重复读取最后一个元素 list.push_back(temp); } return 0; }
内容的提问来源于stack exchange,提问作者Mostafa Anwar
相关产品推荐
相关产品推荐

