首页 > 解决方案 > 在 C++ 中的派生类之间共享公共代码

问题描述

在下面的示例中尝试在派生类之间共享公共代码时遇到问题:

class BaseWrite {
    public:
    virtual void setup() {}
};

class Write : public BaseWrite {
    public:
    void show() {
        cout << "Show Write" << endl;
    }
    virtual void print() {
        cout << "print Write" << endl;
    }    
};

class CompWrite : public Write {
    public:
    void compFunc() {
        cout << "compFunc details" << endl;
    }
};

//These below "Special" classes are in a separate file and are conditionally included while building the project

class SpecialWrite : public Write {
    public:
    void setup() override {
        cout << "print SpecialWrite setup()" << endl;
    }
};

class SpecialCompWrite : public CompWrite {
    public:
    //any common functions
};

在上面的例子中,一个CompWrite(或SpecialCompWrite)对象应该能够访问类的所有函数以及Writesetup()中被覆盖的实现SpecialWrite

约束是,我不能将setup函数从SpecialWrite类移动到Write类或BaseWrite类。如果它有助于上下文,“Special*”类位于一个单独的文件中,并在构建项目时有条件地包含在内。

一种方法是我也可以简单地覆盖类中的setup函数SpecialCompWrite并从类中复制代码SpecialWrite。但我试图避免这种情况。

标签: c++oopinheritance

解决方案


如果CompWrite可以访问所有公共函数,SpecialWrite那么多重继承可以解决问题,但是两个类都继承自,Write因此必须将继承更改为虚拟,CompWrite该类将如下所示:

class CompWrite : public Write, public SpecialWrite {

如果该setup()函数是唯一需要访问的函数,那么一个新的类SpecialWriteCompWrite继承都可以解决它。

class SetupWrite : public Write {
    public:
    void setup() override {
        cout << "print SpecialWrite setup()" << endl;
    }
};

...

class CompWrite : public SetupWrite {
    public:
    void compFunc() {
        cout << "compFunc details" << endl;
    }
};

...

class SpecialWrite : public SetupWrite {
    public:
    // Other functions
};

推荐阅读