如何在多重继承的抽象方法使用

问题描述 投票:1回答:2

它看起来像有东西,我不理解多重继承和抽象方法。我采取在SystemC的一些硬件功能,具备多目标HWS。我有两个不同层次的软件实现的。第一个是优化性能;在其顶部上的第二一个,具有一定的显示等功能。 [注意,在硬件世界“顶”指的是最高级别的实例,它通常是一个包装或硬件实例的测试平台]

要真正处理HW,在SCSW我实现了“保持()”。当我想在更高的层次上使用它(见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();
}
c++ abstract-class multiple-inheritance systemc
2个回答
1
投票

因为名称查找和虚函数重载大多是正交的机制,这是纯粹的,模糊的同时。你看这里:

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

Holds仰望scSW将进入两个不同的基类子对象(as explained on your previous question)。该scHWVirtual基地。因此,该查找是不明确的。这些是在两个不同的类两种不同的功能由相同的标识符表示。

这不是那么凑巧也是为什么Virtual::HoldsscSW覆盖。从scHW所述构件是不相关的。有一个在scSW没有虚函数置换器,使类保持抽象。


0
投票

看起来你可能不希望多重继承,只是这样做:

 struct scHW : Virtual { virtual bool Holds(){return true;}};
 struct scSW : scHW {};
 ...

方式scHW不是抽象的,可以被实例化。

© www.soinside.com 2019 - 2024. All rights reserved.