c++ - 如何在多重继承中使用抽象方法

标签 c++ abstract-class multiple-inheritance systemc

看来我对多重继承和抽象方法有些不理解。我正在 SystemC 中使用多个目标硬件实现一些硬件功能。我有两个不同级别的软件实现。第一个针对性能进行了优化;第二个在其顶部,具有一些显示等功能。 [注意,在硬件世界中,“top”指的是最高级别的实例,通常是硬件实例的包装器或测试台]

为了实际处理硬件,我在 scSW 中实现了“Hold()”。当我想在更高级别使用它时(参见 SW 和 SW2), 我的编译器说

error: ‘scHW’ is an ambiguous base of ‘SW’
 struct SW : scSW, HW { virtual bool Holds(){return scHW::Holds();} };

invalid new-expression of abstract class type ‘SW2’
     SW2* S2 = new SW2;
                   ^~~
because the following virtual functions are pure within ‘SW2’:
 struct SW2 : scSW, HW {  };

它还添加了:

 request for member ‘Holds’ is ambiguous
     std::cerr << S2->Holds();

我特别不明白,一个方法怎么能同时是纯粹的和模棱两可的呢?我做错了什么?正确的编码方式是什么?

#include <iostream>
struct Virtual { virtual bool Holds() = 0;};
struct scHW { bool Holds(){return true;}};
struct scSW : scHW, Virtual {};
struct HW : scHW { };
struct HW2 : scHW { virtual bool Holds(){return scHW::Holds();}};
struct SW : scSW, HW { virtual bool Holds(){return scHW::Holds();} };
struct SW2 : scSW, HW {  };

int main()
{
    HW* H = new HW;
    HW2* H2 = new HW2;
    scHW* H1 = new scHW;
    SW* S = new SW;
    SW2* S2 = new SW2;
    std::cerr << S->Holds();
    std::cerr << H->Holds();
    std::cerr << H2->Holds();
    std::cerr << S2->Holds();
}

最佳答案

它既纯粹又模糊,因为名称查找和虚函数重写大多是正交机制。你在这里看到:

struct scSW : scHW, Virtual {};
struct HW : scHW { };

scSW 中查找 Holds 将进入两个不同的基类子对象 (as explained on your previous question)。 scHWVirtual 基础。因此,查找是不明确的。这是两个不同类中的两个不同函数,由相同的标识符引用。

这并非巧合,这也是 Virtual::Holds 未在 scSW 中被覆盖的原因。 scHW 中的成员无关。 scSW 中没有虚函数重写,因此该类仍然是抽象的。

关于c++ - 如何在多重继承中使用抽象方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54515104/

相关文章:

c++ - 为什么 "keep_window_open()"不等待输入字符?

c# - 为属性赋值时在构造函数中调用虚拟成员

c++ - 从 C++ 中的抽象类继承

python - 从 OrderedDict 和 defaultdict 继承

C++纯虚类问题

c++ - 我怎样才能知道我的源代码的编译日期?

Java无法扩展ByteBuffer类

多重继承中的 python 'super' - 意外的代码输出

java - 这是否被认为是多重继承

c++ - 为什么我可以有一个 std::vector<std::ofstream*> 但不能有一个 std::vector<std::ofstream> ?