多重继承:使用私有基的成员函数

Multiple inheritance: using a member function of a private base

本文关键字:成员 函数 多重继承      更新时间:2023-10-16

这是我的问题:

#include <iostream>
using namespace std;
class A {
    public:
        virtual void f() = 0;
};
class B {
    public:
        void f() {cout << "Hello world!" << endl;};
};
class C : public A, private B {
    public:
        using B::f; // I want to use B::f as my implementation of A::f
};

int main() {
    C c; // error: C is abstract because f is pure virtual
    c.f(); 
}

到目前为止,我找到了两种解决方法:

  1. 在类 C 中定义一个只调用 B::f 的函数 f。但这很乏味而且不是那么干净(尤其是在为一堆功能执行此操作时)

  2. B 继承自
  3. A,C 继承自 B(所有公共)。对我来说,它不能很好地代表设计。特别是,B不是A,我不希望B依赖A。

你能想到其他可能性吗?

using 声明将 B::f 函数添加到类范围中以进行查找,但该函数仍然是B::f,而不是C::f。您可以在派生类型中定义实现并转发到B::f实现,否则您必须更改继承层次结构,以便BC(虚拟地)从A继承。

void C::f() { B::f(); }   // simple forwarding implementation