class CAnimal
{
private:
voidvirtual Speak(){}
};
class CDog : public CAnimal
{
public:
void Speak(){Print("Гав!");}
};
class CBigDog : public CDog
{
public:
void Speak(){Print("Громкий гав!");}
};
voidOnStart()
{
CDog oDog;
oDog.Speak();
CBigDog oBigDog;
oBigDog.Speak();
CDog* pDog = &oBigDog;
pDog.Speak(); // "Громкий гав!", а не "Гав!", как было бы без виртуального метода
}
你可以用它来做关键字final的类似物,明确地禁止进一步继承。
但正如上面的例子所示,你不能做一个模拟。即使对于私有方法,你也必须指定final。
很奇怪,对于公共继承,最大限度的访问应该受到保护,而不是私人的。
而例子中的函数究竟是被重载了呢?
很奇怪,对于公共继承,最大限度的访问应该受到保护,而不是私人的。
而在这个例子中,这个函数到底有没有重载?
对。我只是自己发现了这一点。
如果你这样做
BASE() {Func();} // вместо void Init() {Func();} Вызов Base.Init() - убрать конечно.
你可以在运行后自己检查,看看你是否知道应该发生什么。
在终端日志中,我得到
笨拙地转到源代码中的指定位置。如果你能在终端日志中双击这样的信息,并直接进入指定的行,那就方便了。
如果有人支持它,请说出来。
最经典的是基类中的接口,在子类中重新定义。
经典的情况是,受保护的/公共的虚拟方法被重写。但对于私人来说,这就不是那么明显了(就应用而言)。谢谢你的答复。
是的,我已经删除了我的例子,没有看到你的回复,这真的很不幸。
我在回答你的问题时,自己也对基础知识感到困惑。 那个例子中的一切都很正确,我不应该删除它。同样的例子,又有一个使用的例子。
我在回答你的时候,自己也被这些基本知识弄糊涂了。 这个例子中的所有内容都是正确的,我不应该删除它。再次举例说明如何使用它。
编译器不做任何解释。
这不是一个很好的例子,因为我们看不到CAnimal接口在哪里被使用。此外,还有两个后裔被公开了。我理解这个话题,所以没关系。
正常的例子。一个抽象的动物基本上会发出一些声音,但未被定义,所以我们不能对它调用Speak()方法;它只能对一个特定物种的动物调用。因此,我们在基类中声明一个封闭的虚拟方法,并在子类中覆盖它并打开它。
正常的例子。一个抽象的动物基本上会发出一些声音,但未被定义,所以我们不能对它调用Speak()方法;它只能对一个特定物种的动物调用。因此,我们在基类中声明一个封闭的虚拟方法,并在子类中覆盖它并打开它。