错误、漏洞、问题 - 页 1678

 
Комбинатор:
你可以用它来做关键字final的类似物,明确地禁止进一步继承。
但正如上面的例子所示,你不能做一个模拟。即使对于私有方法,你也必须指定final。
 
fxsaber:
但正如上面的例子所示,你不能做一个模拟。即使对于私有方法,你也必须指定final。

很奇怪,对于公共继承,最大限度的访问应该受到保护,而不是私人的。

而例子中的函数究竟是被重载了呢?

 
Комбинатор:

很奇怪,对于公共继承,最大限度的访问应该受到保护,而不是私人的。

而在这个例子中,这个函数到底有没有重载?

对。我只是自己发现了这一点。

如果你这样做

BASE() {Func();} // вместо void Init() {Func();} Вызов  Base.Init() - убрать конечно.

你可以在运行后自己检查,看看你是否知道应该发生什么。

 

在终端日志中,我得到

2016.09.12 15:49:14.209 Simple_Test (RTS-9.16,M1)       array out of range in 'Simple_Test.mqh' (85,33)

笨拙地转到源代码中的指定位置。如果你能在终端日志中双击这样的信息,并直接进入指定的行,那就方便了。

如果有人支持它,请说出来。

 
Sergei Vladimirov:

最经典的是基类中的接口,在子类中重新定义。

经典的是当受保护的/公共的虚拟方法被重写时。但对于私人来说,这就不是那么明显了(就应用而言)。谢谢你的答复。
 
fxsaber:
经典的情况是,受保护的/公共的虚拟方法被重写。但对于私人来说,这就不是那么明显了(就应用而言)。谢谢你的答复。

是的,我已经删除了我的例子,没有看到你的回复,这真的很不幸。

我在回答你的问题时,自己也对基础知识感到困惑 那个例子中的一切都很正确,我不应该删除它。同样的例子,又有一个使用的例子。

class CAnimal
{
private:
   void virtual Speak(){}
};

class CDog : public CAnimal
{
public:
   void Speak(){Print("Гав!");}
};

class CBigDog : public CDog
{
public:
   void Speak(){Print("Громкий гав!");}
};

void OnStart()
{
   CDog oDog;
   oDog.Speak();
   
   CBigDog oBigDog;
   oBigDog.Speak();
   
   CDog* pDog = &oBigDog; 
   pDog.Speak();       // "Громкий гав!", а не "Гав!", как было бы без виртуального метода
}
 
Sergei Vladimirov:

我在回答你的时候,自己也被这些基本知识弄糊涂了 这个例子中的所有内容都是正确的,我不应该删除它。再次举例说明如何使用它。

这不是一个好的例子,因为我们看不到CAnimal的接口在哪里被使用。是的,他们还公开了两个后代。我理解这个话题,所以没关系。
 
#property indicator_buffers 1 + 1

编译器不做任何解释。

 
fxsaber:
这不是一个很好的例子,因为我们看不到CAnimal接口在哪里被使用。此外,还有两个后裔被公开了。我理解这个话题,所以没关系。

正常的例子。一个抽象的动物基本上会发出一些声音,但未被定义,所以我们不能对它调用Speak()方法;它只能对一个特定物种的动物调用。因此,我们在基类中声明一个封闭的虚拟方法,并在子类中覆盖它并打开它。

 
Sergei Vladimirov:

正常的例子。一个抽象的动物基本上会发出一些声音,但未被定义,所以我们不能对它调用Speak()方法;它只能对一个特定物种的动物调用。因此,我们在基类中声明一个封闭的虚拟方法,并在子类中覆盖它并打开它。

在子孙类中把它变成私有也是很有用的。为了更好地理解。简而言之,这不是问题所在。