Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
不实现父类的虚拟方法有什么风险? 我对OOP和C++语言都很陌生。 最近我接到了一个任务,提出了一个面向对象的设计-我想我已经做得很好,到目前为止,考虑到我在这方面的知识缺乏。既然我想保持目前为止的表现或者更好,我想澄清我的疑虑_C++_Oop - Fatal编程技术网

不实现父类的虚拟方法有什么风险? 我对OOP和C++语言都很陌生。 最近我接到了一个任务,提出了一个面向对象的设计-我想我已经做得很好,到目前为止,考虑到我在这方面的知识缺乏。既然我想保持目前为止的表现或者更好,我想澄清我的疑虑

不实现父类的虚拟方法有什么风险? 我对OOP和C++语言都很陌生。 最近我接到了一个任务,提出了一个面向对象的设计-我想我已经做得很好,到目前为止,考虑到我在这方面的知识缺乏。既然我想保持目前为止的表现或者更好,我想澄清我的疑虑,c++,oop,C++,Oop,我做了一个设计,基类提供了两个虚拟函数。有些子级同时实现其父级的两个虚拟函数,但有些子级仅实现一个。 现在,我知道这不是有人能想出的最好的/干净的设计,如果我不实现(在某些子对象中)其中一个虚拟方法,我可能会从编译器那里得到警告。我知道我可以实现这些方法,当不需要它们时,它们可以简单地返回异常,或者什么也不做 尽管如此,我的疑问/问题是:不在儿童中实施这些虚拟方法的实际风险是什么?对于没有其父对象的虚拟方法实现的对象,会发生什么?我在寻找一个相当深刻的洞察力——我的意思是,我在寻找一个物体的内脏

我做了一个设计,基类提供了两个虚拟函数。有些子级同时实现其父级的两个虚拟函数,但有些子级仅实现一个。 现在,我知道这不是有人能想出的最好的/干净的设计,如果我不实现(在某些子对象中)其中一个虚拟方法,我可能会从编译器那里得到警告。我知道我可以实现这些方法,当不需要它们时,它们可以简单地返回异常,或者什么也不做

尽管如此,我的疑问/问题是:不在儿童中实施这些虚拟方法的实际风险是什么?对于没有其父对象的虚拟方法实现的对象,会发生什么?我在寻找一个相当深刻的洞察力——我的意思是,我在寻找一个物体的内脏层次上的理解

如果无法给出解释,任何可能的参考都将受到同样的欢迎和赞赏

干杯

编辑
你好谢谢大家的回答。我最初的问题——至少在我的头脑中——与维克多·查塔尔提出的“可能的重复”无关——但他指出的这个问题,以及我问题的所有其他答案澄清并消除了我的疑虑。在一开始,我认为如果child没有从父级实现虚拟方法,就会有某种“洞”,在那里应该有一个方法(或指向方法的指针,或任何东西)。但是接下来会发生的事情是,孩子将使用父母的实现。 谢谢大家,很抱歉问了一些其他地方已经回答过的问题。问题是,在给别人的评论之前,我应该多读一些东西是如何工作的——这就是我第一次问这个问题的原因。 我以后尽量不重犯这个错误

有些子级同时实现其父级的虚拟函数,但 有些人只实现一个

这很好,这也是
virtual
方法不同于
abstract
方法的原因之一,前者是可选的,可以在更具体的类型(子类)中重写

我知道我可以实现这些方法,当它们不需要时,它们就可以实现 可以简单地返回异常,也可以不执行任何操作


抛出异常(比如说未实现或支持异常)是个坏主意。如果您知道特定类型不支持特定行为,则该行为不应是基类本身的一部分。您应该使用接口来实现这些行为(特定于某些派生类)。

这不是正确的问题。正确的问题是,如果子类只重写允许重写的一个或两个函数,那么问题是“我的子类是否应该从父类派生?”。例如,坏继承的一个例子是:

class shape
{
public:
   virtual void draw();
   virtual void print();
};

class log : public shape
{
public:
   void print() override;
};
这是一个糟糕的继承,因为两者都需要一个print方法,但log类与绘图无关,也与形状无关。这是危险的,不是在安全方面,而是在任何使用您的代码的人都会非常困惑的意义上

更好的继承的一个例子是:

class shape
{
public:
   virtual void draw() = 0;
};

class rectangle : public shape
{
   virtual void draw();
};

在这里,正方形继承自形状,因为矩形是形状,继承强制矩形定义绘制方法。有了这种继承,就可以很清楚地知道发生了什么,而且不存在任何风险。

您可能会混淆虚拟方法和纯虚拟方法

虚拟方法只是子类可以重写的常规方法,这意味着“将默认行为替换为自定义行为”。 您这样声明它们:

virtual ReturnType myVirtualMethod();
另一方面,纯虚拟方法要求在子类中实现它们。当父类中无法编写任何合理的默认行为时,可以使用它们。如果您没有实现它们,子类将无法编译,这很好,因为它可以防止未定义的行为——在这种情况下:当没有提供方法时,应该运行什么?编译器不可能做出决定。 可以使用以下语法声明它们:

virtual ReturnType myVirtualMethod() = 0; // notice the "= 0" at the end
<> >我想你应该问自己的问题是:“我能提供在这种情况下对这个方法起作用的默认行为吗?”如果不是,你应该考虑使方法纯虚化,否则在父类中实现默认行为,并且不麻烦在不需要它的子类中重写该方法。
希望这有帮助

重写虚拟定义的继承方法不是强制性的,这取决于您的需要。您能显示一些代码吗?当派生类不实现虚拟方法时,您怎么会认为存在风险?如果派生类与基提供的方法配合良好,则没有理由重写它,恐怕没有比Hi的可能副本更深入的见解了。谢谢大家的回答。我最初的问题——至少在我的头脑中——与维克多·查塔尔提出的“可能的重复”无关——但他提出的问题以及对我问题的所有其他答案澄清并消除了我的疑虑。在一开始,我认为如果child不实现父级的虚拟方法,就会有某种“漏洞”,其中应该有一个方法(或指向方法的指针,或其他什么)。但是接下来会发生的事情是,孩子将使用父代的实现