#include <iostream>
class Base{
public:
void foo() const { std::cout << "Basic foo()" << std::endl; }
virtual void bar() const { std::cout << "Basic bar()" << std::endl; }
};
class Derived
: public Base
{
public:
void foo() const { std::cout << "Derived foo()" << std::endl; }
virtual void bar() const override { std::cout << "Derived bar()" << std::endl; }
};
int main(){
Derived obj;
Base& interface = obj;
interface.foo(); //"Basic foo()"
interface.bar(); //"Derived bar()"
}
覆盖非虚拟成员可能会产生意想不到的结果,很难跟踪。即使你知道自己在做什么,你通常也不是唯一一个从事项目的人,这种代码也不是惯用的。类层次结构通常用于动态多态,当您覆盖多态对象的行为时,您希望它在强制转换为基本时表现相应。
正如适用于C的每一条规则一样,这更多是一条经验法则,而不是一条戒律,因为这可能偶尔有用。
问题内容: 我应该为我创建的任何类重写函数吗? 即使是非常简单的类只包含一些非常简单的属性,并通过 平等 ,我需要它的每一个属性是一样的吗? 问题答案: 我应该为我创建的任何类重写equals函数吗? 当(且仅当)对象“表示某些数据”(即,如果它对,或(例如,这些通常以集合等结尾))进行建模时,覆盖。不要覆盖其他类型的类的equals,例如或。 请记住,无论何时重写,都应始终重写。 (一个自然的后
在C 11之前,当在派生类中重写虚拟函数时,建议将虚拟关键字也添加到派生类函数中,以明确其意图。 如今,这样的函数被标记为“override ”,这包含了必须有一个虚基类函数的概念。因此,我现在宁愿省略虚拟的: 然而,这会导致MSVC 2012中的IntelliSense错误:“覆盖”修饰符需要带有显式“虚拟”关键字的虚函数声明 显然编译器编译了类,但错误让我想到了它。是否仍有正当理由添加虚拟关键
链接的问题不一样 - 甚至没有提到 编辑:新的副本列表包含一个合法的副本,我在搜索中没有找到。 在问这个问题之前,我不知道是否在派生类成员中使用的选择对某些人来说将是一个有争议的问题。 我刚刚遇到了一些如下所示的源代码: 我不确定如何解释这个,甚至在读完这个之后。 这里的< code>override是指< code>virtual吗?< code>void B::method()未被标记为虚函数
在过去的几周里,有一些关于< code>virtual和< code>override的事情困扰着我的大脑。我了解到,当你用虚函数做继承时,你必须添加< code>virtual来让编译器知道搜索正确的函数。后来我还了解到在c 11中有一个新的关键字- 。现在我有点迷茫;我需要在程序中同时使用虚拟关键字和重写关键字吗,或者最好只使用其中一个? 解释我自己-我的意思的代码示例: 最好的方法是什么?
我读到虚拟析构函数必须在具有虚拟方法的类中声明。我只是不明白为什么必须宣布它们是虚拟的。我从下面的例子中知道为什么我们需要虚拟析构函数。我只是想知道为什么编译器不为我们管理虚拟析构函数。关于虚拟析构函数的工作,有什么我需要知道的吗?以下示例显示,如果析构函数未声明为虚拟,则派生类的析构函数不会被调用,这是为什么?
关于什么时候使用Docker而不是VM的,有什么指导方针吗?(反之亦然) 在我看来,像NGINX、Apache或Redis这样的服务应该是docker,但我不确定是否应该在HPC环境中使用ElasticSearch docker。 Docker总是比VM好吗?