gpt4 book ai didi

c++ - 使用虚函数而不覆盖该虚函数的目的

转载 作者:行者123 更新时间:2023-12-04 08:27:03 25 4
gpt4 key购买 nike

我目前正在学习编程面试的教育类(class)。虽然这是一门非常好的类(class)并且确实很好地解释了算法,但它并不总是解释代码。
有几次我看到了 virtual 的使用函数,作为一个动态函数(明确地说,我的意思是需要实例化一个对象才能被调用的函数)。从阅读开始 virtual函数,我认为它们用于实现一些 OOP 原则,例如运行时多态性,或者只是一般地提高某些代码的可维护性。在这些算法问题的情况下,这似乎完全没有必要。事实上,我可以删除 virtual关键字和代码运行完全相同。
我的问题是:为什么作者会使用 virtual定义这些功能?
以下是类(class)作者使用虚函数的示例:

using namespace std;

#include <iostream>
#include <queue>
#include <vector>

class MedianOfAStream {
public:
priority_queue<int> maxHeap; // containing first half of numbers
priority_queue<int, vector<int>, greater<int>> minHeap; // containing second half of numbers

virtual void insertNum(int num) {
if (maxHeap.empty() || maxHeap.top() >= num) {
maxHeap.push(num);
} else {
minHeap.push(num);
}

// either both the heaps will have equal number of elements or max-heap will have one
// more element than the min-heap
if (maxHeap.size() > minHeap.size() + 1) {
minHeap.push(maxHeap.top());
maxHeap.pop();
} else if (maxHeap.size() < minHeap.size()) {
maxHeap.push(minHeap.top());
minHeap.pop();
}
}

virtual double findMedian() {
if (maxHeap.size() == minHeap.size()) {
// we have even number of elements, take the average of middle two elements
return maxHeap.top() / 2.0 + minHeap.top() / 2.0;
}
// because max-heap will have one more element than the min-heap
return maxHeap.top();
}
};

int main(int argc, char *argv[]) {
MedianOfAStream medianOfAStream;
medianOfAStream.insertNum(3);
medianOfAStream.insertNum(1);
cout << "The median is: " << medianOfAStream.findMedian() << endl;
medianOfAStream.insertNum(5);
cout << "The median is: " << medianOfAStream.findMedian() << endl;
medianOfAStream.insertNum(4);
cout << "The median is: " << medianOfAStream.findMedian() << endl;
}
再一次,从我读过的所有内容来看,我真的没有看到这一点。并且,在没有 virtual 的情况下运行这个确切的代码关键字工作得很好。我的想法是,这是 C++ 领域的某种最佳实践。
感谢您的任何解释!

最佳答案

From reading up on virtual functions, I gather that they are used to achieve some OOP principles such as run time polymorphism


是的。

or just generally improving the maintainability of some code


不。

In the case of these algorithms questions, that seems to be completely unnecessary. In fact, I am able to just delete the virtual keyword and the code runs all the same.


是的。

My question is: Why might the author be using virtual to define these functions?


我在这里看到三种可能性:
  • 作者将在后面的章节中继承这个类,并且通过放置 virtual 已经“准备好了”。现在在成员函数声明上。我认为这是一个有点奇怪的选择,就个人而言(特别是因为他们当时也可能想要添加一个虚拟析构函数),但也许继续阅读并找出答案!
  • 作者总是出于习惯这样做,即使他们不需要。有些人喜欢将每个函数都设置为虚拟函数,这样您就可以“默认”获得动态多态性,而无需在以后从基类派生时更改基类。我认为这也是一件非常奇怪的事情,就个人而言。
  • 作者犯了一个错误。

  • a dynamic function (to be clear, I mean functions that require the instantiation of an object in order to be called)


    我们称这些非静态成员函数。

    关于c++ - 使用虚函数而不覆盖该虚函数的目的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65207893/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com