- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我不知道为什么下面的代码可以编译和工作(它工作得很好)。
#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()
)。
你能解释一下为什么我能够在 Base
中调用一个纯虚函数吗?类在执行 friend std::ostream& operator<<(...)
?我认为这不应该是可能的。
最佳答案
您可以调用纯虚函数,因为当您调用它时,该函数不再是纯虚函数:派生类必须覆盖它才能停止“抽象”。
编译器知道你不能实例化类 Base
通过它自己。这意味着您将无法调用 operator <<
在任何不为您的纯虚函数提供合适覆盖的类上。这就是编译器允许您进行调用的原因:它知道在运行时将有一个实现。
注意:调用纯虚函数的唯一方法是从基类的构造函数中调用它。由于函数是纯虚函数,这会导致未定义的行为;现代编译器会警告您这个问题。
关于c++ - 从 operator<< 调用纯虚函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27872326/
我有一个特别的问题想要解决,我不确定是否可行,因为我找不到任何信息或正在完成的示例。基本上,我有: class ParentObject {}; class DerivedObject : publi
在我们的项目中,我们配置了虚 URL,以便用户可以在地址栏中输入虚 URL,这会将他们重定向到原始 URL。 例如: 如果用户输入'http://www.abc.com/partner ',它会将它们
我是一名优秀的程序员,十分优秀!