gpt4 book ai didi

c++ - 从 operator<< 调用纯虚函数

转载 作者:搜寻专家 更新时间:2023-10-31 01:41:49 27 4
gpt4 key购买 nike

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

#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<<在派生类中,即仅在基类中定义一次,然后将虚拟分派(dispatch)与另一个函数一起使用(在我的例子中,display())。

参见 Live on Coliru

你能解释一下为什么我能够在 Base 中调用一个纯虚函数吗?类在执行 friend std::ostream& operator<<(...) ?我认为这不应该是可能的。

最佳答案

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

编译器知道你不能实例化类 Base通过它自己。这意味着您将无法调用 operator <<在任何不为您的纯虚函数提供合适覆盖的类上。这就是编译器允许您进行调用的原因:它知道在运行时将有一个实现。

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

关于c++ - 从 operator<< 调用纯虚函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27872326/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com