C++ 从运算符调用纯虚函数<&书信电报;

C++ 从运算符调用纯虚函数<&书信电报;,c++,polymorphism,C++,Polymorphism,我不知道为什么下面的代码可以编译并工作(它工作得很好) #包括 结构基 { 虚拟std::ostream&display(std::ostream&os)const=0; friend std::ostream&operator您可以调用纯虚拟函数,因为当您调用它时,该函数不再是纯虚拟的:派生类必须重写它才能停止“抽象” 编译器知道你不能自己实例化类Base。这意味着你不能调用操作符,为什么不可能呢?如果你不能通过指向基类的指针或引用调用纯虚函数,它们将不会很有用。也许我遗漏了一些东西,但我认为

我不知道为什么下面的代码可以编译并工作(它工作得很好)

#包括
结构基
{
虚拟std::ostream&display(std::ostream&os)const=0;

friend std::ostream&operator您可以调用纯虚拟函数,因为当您调用它时,该函数不再是纯虚拟的:派生类必须重写它才能停止“抽象”


编译器知道你不能自己实例化类
Base
。这意味着你不能调用
操作符,为什么不可能呢?如果你不能通过指向基类的指针或引用调用纯虚函数,它们将不会很有用。也许我遗漏了一些东西,但我认为不能“叫"一个纯虚拟函数,只重载它并在派生类中调用它。当然你可以调用它,你只是不能实例化一个有纯虚拟函数的类。@CaptainObvlious我想我问了一个愚蠢的问题:-/当然,你通过引用调用它……我周末休息一下:)是的,我把自己搞糊涂了,我把它叫做via是一个参考,所以通常的虚拟调度规则适用…我不好意思问这个问题。。。
#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;
}