从operator <<调用纯虚函数

虚拟软件公司

我不知道为什么下面的代码可以编译和运行(工作正常)。

#include <iostream>

struct Base
{
    virtual std::ostream& display(std::ostream& os) const = 0;
    friend std::ostream& operator<<(std::ostream& lhs, const Base& rhs)
    {
        return rhs.display(lhs);
    }
};

struct A: Base
{
    virtual std::ostream& display(std::ostream& os) const
    {
        return os << "A" << std::endl;
    }
};

struct B: A
{
    virtual std::ostream& display(std::ostream& os) const
    {
        return os << "B" << std::endl;
    }
};

int main()
{
    A a;
    std::cout << a << std::endl;

    B b;
    std::cout << b << std::endl;
}

我在类中定义了operator<<唯一的一次Base,它调用了纯virtual display函数。此方案通常用于避免operator<<在派生类中进行重写,即在基类中仅对其定义一次,然后将虚拟分派与另一个函数一起使用(在我的情况下为display())。

Live on Coliru

您能解释一下为什么我能够Base在实现中内部调用纯虚函数friend std::ostream& operator<<(...)吗?我认为这不可能。

谢尔盖(Sergey Kalinichenko)

您可以调用纯虚函数,因为到调用它时该函数不再是纯虚函数:派生类必须重写它才能停止“抽象”。

编译器知道您不能单独实例化类Base这意味着您将无法调用operator <<没有为纯虚函数提供适当替代的任何类。这就是编译器允许您进行调用的原因:它知道在运行时将有一个实现。

注意:调用纯虚函数的唯一方法是从基类的构造函数中调用它。由于该函数是纯虚函数,因此会导致未定义的行为。现代编译器会警告您有关此问题的信息。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

从operator <<调用纯虚函数

来自分类Dev

C ++纯虚函数调用的性能差异

来自分类Dev

纯虚函数实现

来自分类Dev

纯虚函数调用有趣的情况

来自分类Dev

C ++ 11线程,错误调用了纯虚函数

来自分类Dev

C ++:通过调用纯虚函数避免重复

来自分类Dev

禁止消息框R6025纯虚函数调用

来自分类Dev

让 SDL 调用纯虚成员函数作为事件回调?

来自分类Dev

纯虚函数覆盖虚函数

来自分类Dev

纯虚函数覆盖虚函数

来自分类Dev

推导纯虚函数的实现

来自分类Dev

如何实现纯虚函数

来自分类Dev

专用纯虚函数的目的?

来自分类Dev

编译时纯虚函数

来自分类Dev

C ++:从同一类的成员函数调用纯虚函数

来自分类Dev

为什么在构造函数内部的子元素中调用纯虚函数不起作用?

来自分类Dev

使用b2FixtureDef的box2d CreateFixture提供了纯虚函数调用

来自分类Dev

如何将C ++类转换为托管类并在其中调用纯虚函数?

来自分类Dev

从未定义基类的纯虚函数中调用它?

来自分类Dev

禁止从构造函数调用纯虚方法的编译器选项

来自分类Dev

在线程中调用纯虚方法

来自分类Dev

具有纯虚拟operator +函数的C ++抽象基类

来自分类Dev

奇怪的行为C ++纯虚函数

来自分类Dev

从派生的模板类重写纯虚函数

来自分类Dev

D中的C ++ DLL(纯虚函数)

来自分类Dev

从模板化类重写纯虚函数

来自分类Dev

制作纯虚函数的好坏习惯

来自分类Dev

重新声明纯虚函数

来自分类Dev

通过lamda实现纯虚函数