实现从乙继承A,使用混凝土函数继承虚拟功能

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

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

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.

阅读一些其他职位计算器(如this之一)后,它似乎是唯一可用的解决方案是要做到这一点:

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

在连接后,在OP并不介意键入三个多余的线条。但是,你能想象,其实我是想partialImplementation实施不仅仅是一个功能更多,我可以一遍又一遍,每次打字这个相同的样板我想使一个新的类继承这个接口。

有谁知道一个办法做到这一点,而无需partialImplementationinterface继承?

c++ inheritance abstract-class multiple-inheritance
1个回答
0
投票

The option you don't want

目前尚不清楚你打算做什么。但有一两件事是肯定的:在您的解决方案fnA()partialImplementation无关与fnA()interface,因为这两个类是不相关的。此外,在partialImplementation这个功能是不是虚拟的。

因此,为了得到partialImplementationfnA()在从接口派生的类的虚函数,你已经暴露了明确的呼叫进行的唯一途径。

如果你想摆脱的样板代码,你必须做出partialImplementationinterface继承。它仍然是不能被实例化一个抽象类,因为fnB()至今下落不明。

class partialImplementation : public interface { ... };

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

Want to combine several partial implementations ?

为什么你不希望这个产业目前尚不清楚。如果你要在若干个不同的部分实现结合起来,在一个mixin阶梯,但要避免几个不同的接口子对象,你可以选择虚拟继承:

class partialImplementationA : public virtual interface { 
public: 
    void fnA() const {cout << "fnA from partial implementation A" << endl;}
};
class partialImplementationB : public virtual interface { 
public: 
    void fnB() const {cout << "fnB from partial implementation B" << endl;}
};

class myClass : public virtual interface, 
                public partialImplementationA, 
                public partialImplementationB {
public:
};

Online demo

带来的不便,是继承已被宣布为各级虚拟。但它允许达到的那种你希望在无样板代码做的事情。

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