c++ - 使用 using 实现纯虚函数
问题描述
考虑以下程序
class Node {
public:
virtual void Visit() = 0;
};
class Graph {
public:
virtual void Visit();
};
class GraphNode1 : public Node, Graph {
};
class GraphNode2 : public Node, Graph {
using Graph::Visit;
};
class GraphNode3 : public Node, Graph {
public:
virtual void Visit() {
Graph::Visit();
}
};
int main()
{
GraphNode1 a;
GraphNode2 b;
GraphNode3 c;
}
它不编译,但抱怨它GraphNode1
是GraphNode2
抽象的,因为Node::Visit
它是纯虚拟的。
我会假设两者GraphNode1
都GraphNode2
很好,因为:
- 它们包含
Visit
. - 它们仅包含 的单个实现
Visit
,因此不应有歧义。
谁能解释为什么我必须创建一个显式实现才能使其工作。
解决方案
Node
并且Graph
是不相关的类。这使得Node::Visit
和Graph::Visit
不同的不相关的成员函数。
两者都不能覆盖另一个。您似乎认为Graph::Visit
比非纯虚拟的“更好” Node::Visit
,因此应该覆盖它。但是没有客观原因。对于初学者,纯虚函数可以有一个定义:
struct A {
virtual void thing() = 0;
};
inline void A::thing() {}
其次,一个函数可以在被覆盖时变成纯虚函数:
struct A {
virtual void thing() {}
};
struct B : A {
void thing() override = 0;
};
所以真的,没有理由Node::Visit
和Graph::Visit
作为彼此的替代者进行交互。这就是为什么您需要明确并自己定义一个将用作覆盖器*的函数的原因。
* C++的一个缺点是您实际上在 . IMO 这是语言的一个怪癖(真的,应该可以保持它们不相关)。MSVC 有一个扩展,可让您以更细粒度的方式选择要覆盖的内容。Node::Visit
Graph::Visit
GraphNode3
推荐阅读
- amazon-web-services - AWS JWT 授权者不支持谷歌发行者
- ios - PHAsset 无法获取
- c++ - 在 C++ 中传入 vs 分配 const 引用
- windows - 尝试批量重命名文件夹
- python - 我无法使用最新的 opencv 版本创建识别器
- android - Android Studio 多预览?
- google-cloud-platform - 访问 Google Cloud Storage (Bucket) 中的 xml 文件是一项操作吗?
- python - IndexError:无法从 emty 序列中选择
- macos - 为什么 NSTextView 在调整大小时并不总是能流畅地换行?
- centos - CentOS 8 窗格已死 VMware Workstation 15.5