在 C++ 中使用继承的编译器错误

Posted

技术标签:

【中文标题】在 C++ 中使用继承的编译器错误【英文标题】:Compiler errors using inheritance in C++ 【发布时间】:2021-06-05 15:51:07 【问题描述】:

我是 C++ 的新手。我编写了一个示例代码来说明问题并导致编译器错误。

class Quantifier;

class Node 
public:
    virtual void Match(/* args */) = 0;
;

class QuantifiableNode : public Node 
public:
    virtual void SetQuantifier(Quantifier *quantifier) = 0;
;

class NodeBase : public Node 
public:
    void Match() override 
        // Base behavior
    
;

class QuantifiableNodeImpl : public NodeBase, // Needed to inherit base behavior
                             public QuantifiableNode // Needed to implement QuantifiableNode interface

public:
    void SetQuantifier(Quantifier *quantifier) override 

    void Method() 
        this->Match();
    
;

int main() 
    QuantifiableNodeImpl node;
    node.Match();
    return 0;

我收到以下错误:

main.cpp(27): error C2385: ambiguous access of 'Match'
main.cpp(27): note: could be the 'Match' in base 'NodeBase'
main.cpp(27): note: or could be the 'Match' in base 'Node'
main.cpp(32): error C2259: 'QuantifiableNodeImpl': cannot instantiate abstract class
main.cpp(20): note: see declaration of 'QuantifiableNodeImpl'
main.cpp(32): note: due to following members:
main.cpp(32): note: 'void Node::Match(void)': is abstract
main.cpp(5): note: see declaration of 'Node::Match'
main.cpp(33): error C2385: ambiguous access of 'Match'
main.cpp(33): note: could be the 'Match' in base 'NodeBase'
main.cpp(33): note: or could be the 'Match' in base 'Node'

据我了解,编译器无法编译此代码,因为类QuantifiableNodeImpl 继承了类NodeBase 和接口QuantifiableNode,它们都有一个方法MatchNodeBaseNode 实现它, QuantifiableNodeNode 继承抽象方法)。 我需要同时拥有NodeQuantifiableNode 两个接口,并在另一个代码中使用它们。另外,我需要有NodeBase 类来分离基本功能(在我的真实代码中,我有很多NodeBase 的衍生物)。

另外,类QuantifiableNodeImpl的对象也不能被创建,编译器说它有一个未实现的抽象Match方法。

那么,我该怎么办?希望得到您的帮助!

【问题讨论】:

您可能需要查找虚拟继承。相关:https://***.com/questions/21558/in-c-what-is-a-virtual-base-class 【参考方案1】:

您似乎对钻石继承并不完全熟悉。 QuantifiableNodeImpl 有两个Node 子对象,一个通过NodeBase,一个通过QuantifiableNode。第二个Node 子对象缺少QuantifiableNode::Match

这似乎不是故意的:QuantifiableNode 真的应该是 Node 本身吗? QuantifiableNode::Match 应该如何工作?

可能Quantifiable 更准确地建模为mixin

【讨论】:

以上是关于在 C++ 中使用继承的编译器错误的主要内容,如果未能解决你的问题,请参考以下文章

为啥 C++ 构造函数在继承中需要默认参数?

C ++编译器错误中的简单类继承[重复]

c++模板和继承

编译器如何在继承 C++ 中进行组合?

(C++) 我的自定义数组无法初始化(编译错误)

C++ 赋值运算符关于继承的问题