加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 合法调用纯粹的虚拟函数

发布时间:2020-12-16 05:39:08 所属栏目:百科 来源:网络整理
导读:我确信我们都看到代码崩溃,由于一个错误,导致一个纯粹的虚拟函数被调用.一个简单的例子就是这样: struct Base{ Base() { method(); } virtual void method() = 0;};struct Derived : Base{ void method() {};};int main(){ Derived d;} 在这种情况下,在Base
我确信我们都看到代码崩溃,由于一个错误,导致一个纯粹的虚拟函数被调用.一个简单的例子就是这样:
struct Base
{
    Base() { method(); }

    virtual void method() = 0;
};

struct Derived : Base
{
    void method() {};
};

int main()
{
    Derived d;
}

在这种情况下,在Base构造函数中对method()的调用由C标准的第10.4 / 6节特别引用为未定义的行为,所以我们最终不会惊讶. (g和Clang都警告这一点,实际上链接失败了g和这个例子,虽然Clang成功了.)

但是,只是为了乐趣,有人可以提出一种方法来调用一个不依赖于未定义行为的纯虚拟函数?

(我想你可以争辩说,如果这样的方法存在,那么C标准有缺陷,但我只是好奇…)

编辑:几个答案的人,谢谢,但我应该明确表示,我意识到做一个非虚拟调用一个纯粹的虚拟函数(提供定义存在于某个地方)是合法的.我更想知道法律中是否有任何巧妙的漏洞,可能导致虚拟通话,因此很可能在没有定义的常见情况下崩溃.

例如,也许通过多重继承,可以执行一些聪明(合法)的转换,但最终会被称为“错误的”(未实现的)PV方法().我只是以为这是一个有趣的脑力激荡:-)

解决方法

非虚拟地调用纯虚拟函数是完全合法的:
Derived d;
d.Base::method();

当然,这需要定义功能,在你的例子中不是这样.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读