繁体   English   中英

关于 C++ 中的纯虚函数的问题?

[英]Question about Pure Virtual Functions in C++?

我正在阅读一些 C++ 文本重新分级纯虚拟功能。 正如文中所说,纯虚函数声明的形式,例如,是:

virtual void virtualfunctioname() = 0;

文本解释说:“由于纯虚拟 function 没有主体,程序员必须在基础 class 中添加符号 =0 以声明纯虚拟 function。”

我试图删除= 0; ,这意味着我只声明了virtual void virtualfunctioname(); 一切都很好。

那么,为什么我们需要为虚拟 function 分配一个 0 呢? 谢谢

如果 class 有任何纯虚函数,则无法实例化。 此外,它强制任何派生类实现这些功能,否则它们也无法实例化。

因此,如果您删除= 0 ,您将只有一个普通的基础 class,它可以被实例化,并且不会在其派生类上强制执行接口。 只有实例化基类 object(或派生类 object 没有覆盖),然后尝试在其上调用virtualfunctionname() ,因为它没有定义,所以 Z3175B4273046707BEECE273 .

[注意,“纯虚函数没有主体”的说法也是不正确的; 您可以为纯虚拟定义一个实现。 不过,class 仍然是抽象的。]

如果您不将方法声明为纯虚拟方法,编译器将假定某处存在该方法的实现。 如果您从不实例化 class 应该包含那些纯虚拟(和抽象 class 使用正确的术语),你会没事的。 但是,如果您这样做,编译器将接受该代码为有效,并且稍后您将收到 linker 错误。

如果将方法标记为纯虚拟方法,则包含它的 class 将被标记为抽象,编译器将拒绝任何实例化它的尝试。

当您将 function 声明为纯虚拟 function 时,包含该 class 的 class 将被称为抽象 ZA2F2ED4F198EBC2CAB614DC20 实例。 同样不会创建 class 的实例。此 class 用于 inheritance 并且派生的 ZA2F2ED4F8EBC04ABBB4C21A29 必须实现此方法。 否则会出现编译错误。 谢谢

一切正常

我假设您的意思是编译和链接的代码。 但是,您可能尚未在声明的基本virtualfunctionname中定义 virtualfunctionname 的实现,因此如果您调用基本实现,您将收到 linker 错误。

目前,事情可能会奏效,因为您在派生的 class 中提供了一个实现并改用它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM