使用从B继承的具体功能实现从A继承的虚拟功能

时间:2019-02-03 17:57:10

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

假设我有一个接口类和一个部分实现类。另外,假设我绝对不希望该部分实现从接口继承:

class interface {
    virtual void fnA() const = 0; 
    virtual void fnB() const = 0; 
};

class partialImplementation { //Do not want to inherit from interface!
    void fnA() const {cout << "fnA from partial implementation" << endl;}
    //fnB() not implemented
};

这个想法是我打算制作几个都继承该接口的新类,但是我想在每个类中实现相同的fnA()。因此,在继承接口之后,也许我也可以继承部分实现,并希望实现fnA()。例如,

class myClass : interface, partialImplementation {
    //would like fnA() to be implemented by partialImplementation
    void fnB() const {cout << "fnB from myClass" << endl;} 
};

当然,如果尝试实例化此类,则会出现此错误:

main.cpp: In function 'int main()':
main.cpp:235:10: error: cannot declare variable 'm' to be of abstract type 'myClass'
main.cpp:201:7: note:   because the following virtual functions are pure within 'myClass':
main.cpp:193:15: note:  virtual void interface::fnA() const
Compilation failed.

在阅读了一些其他stackoverflow帖子(例如this)之后,似乎唯一可用的解决方案是执行以下操作:

class myClass : interface, partialImplementation {
    public:
    void fnB() const {cout << "fnB from myClass" << endl;} 
    void fnA() const {
        partialImplementation::fnA();
    }
};

在链接的帖子中,OP不在乎键入三行。但是您可以想象,我实际上希望partialImplementation实现的不仅仅是一个函数,而且每次我想创建一个继承该接口的新类时,我可能会一遍又一遍地键入相同的样板。

有人知道一种无需partialImplementationinterface继承的方法吗?

1 个答案:

答案 0 :(得分:0)

您不想要的选项

目前尚不清楚您打算做什么。但是可以肯定的是:在您的解决方案中,fnA()的{​​{1}}与partialImplementation的{​​{1}}没有任何关系,因为这两个类都不相关。此外,在fnA()中,此功能不是虚拟的。

因此,要使interface的{​​{1}}作为从接口派生的类中的虚函数,必须进行公开的显式调​​用。

如果要摆脱样板代码,则必须使partialImplementationpartialImplementation继承。由于fnA()仍然缺少,因此它将仍然是无法实例化的抽象类。

partialImplementation

想结合几个部分实现吗?

不清楚您为什么不想要这种继承。如果要在mixin阶梯中组合几个不同的部分实现,但又想避免有几个不同的接口子对象,则可以选择虚拟继承:

interface

Online demo

不便之处在于,必须在所有级别将继承声明为虚拟。但是,它允许您在没有样板代码的情况下完成您想做的事情。