有没有办法实现抽象类的实现,它是C++中其他抽象类的多重继承?

有没有办法实现抽象类的实现,它是C++中其他抽象类的多重继承?,c++,abstract-class,multiple-inheritance,C++,Abstract Class,Multiple Inheritance,我有两个“接口”类:AbstractAccess和AbstractPrint,AbstractRun类继承它们并使用它们的方法。 另外,我有两个接口的实现:AbstractAccess的访问器和AbstractPrint的打印 有没有办法将AbstractRun中的接口强制转换为它们的实现,或者创建只使用AbstractRun的“Run”方法但带有实现接口的实现类Run?虽然您已经解决了问题,但我进一步研究了这个问题,我想澄清一些关于继承的困惑 当您的a类与另一个类具有is关系时,将使用继承。派

我有两个“接口”类:AbstractAccess和AbstractPrint,AbstractRun类继承它们并使用它们的方法。 另外,我有两个接口的实现:AbstractAccess的访问器和AbstractPrint的打印


有没有办法将AbstractRun中的接口强制转换为它们的实现,或者创建只使用AbstractRun的“Run”方法但带有实现接口的实现类Run?

虽然您已经解决了问题,但我进一步研究了这个问题,我想澄清一些关于继承的困惑

当您的a类与另一个类具有is关系时,将使用继承。派生类应该是继承自的类的替换

在您的例子中,您可以放心地说类Print是类AbstractPrint,而类访问同样是类AbstractPrint,因此继承在这里很好

另一方面,类AbstractRun不是AbstractPrint,也不是AbstractAccess。AbstractRun只处理/组合AbstractPrint和AbstractAccess。这种关系应该通过聚合或组合进行抽象,因为AbstractRun有一个指向AbstractRun和AbstractPrint的引用/指针。这将使AbstractRun变得具体,所以让我们将其重命名为Runner

现在可以像以前一样定义访问和打印

但我们也要改进这些方面:

class Print: public virtual AbstractPrint {
    public:
        void print (string s) {                                                                                                                                                                                    
            cout << s << endl;                                                                                                                                                                                     
        }
};
现在,在初始化运行程序时,我们需要传递具体的访问器和打印机。这可以通过以下方式实现:

// Somewhere in a .cpp - file

Accessor accessor;
Print printer;

Runner runner(accessor, printe);

runner.run(); //will call printer and accessor through the references.

我也不理解第一部分,但是如果我理解正确的话,第二部分很简单:类运行:public virtual AbstractRun,public virtual Accessor,public virtual Print{…}@Beta非常感谢。你已经正确地理解了,你的食谱很有魅力。如果第二个部件正常工作,则不需要第一个部件。多谢你多花点时间。
class Print: public virtual AbstractPrint {
    public:
        void print (string s) {                                                                                                                                                                                    
            cout << s << endl;                                                                                                                                                                                     
        }
};
class Accessor : public AbstractAccess {
    public:
        string access (void){
            return name;
        }

        void setName(string name) {
            this->name = name;
        }
    private:
        string name;
}; 

class Print: public AbstractPrint {
    public:
        void print (string s) {                                                                                                                                                                                    
            cout << s << endl;                                                                                                                                                                                     
        }
};
class Accessor : public AbstractAccess {
    public:
        string access (void) override { //overrides  AbstractAcces method
            return name;
        }

        void setName(string name) { //does not override. is a method at Accessor level
            this->name = name;
        }
    private:
        string name;
}; 
// Somewhere in a .cpp - file

Accessor accessor;
Print printer;

Runner runner(accessor, printe);

runner.run(); //will call printer and accessor through the references.