多个基类可以具有相同的虚拟方法吗?

Can multiple base classes have the same virtual method?

本文关键字:虚拟 方法 基类      更新时间:2023-10-16
  1. 类 A 有一个纯虚拟方法read()
  2. 类 B 有一个实现的虚拟方法read()
  3. 我有一个继承 A 和 B 的 C 类
  4. 这能发生吗?

我试图实现的是两个基类 A 和 B 相互补充。

因此,C read()方法实际上会调用 B 类read()

class A {
    virtual int get_data() = 0;
    void print() {
        log(get_data());
    }
}
class B {
    virtual int get_data() {
        return 4;
    }
}
class C : public A, public B {
}
C my_class;
my_class.print(); // should log 4;

我不在我的电脑上,在接下来的几周内也不会有机会,所以我无法测试这个......但我正在设计架构,需要知道这是否可能,如果不可能。这怎么可能做到!

多个基类可以具有相同的虚拟方法吗?

  1. 这能发生吗?

是的。

所以 C read(( 方法实际上会调用类 B read((

这不会自动发生。base 的成员函数不会覆盖不相关的 base 的函数。

您可以向C添加覆盖:

class C : public A, public B {
    int get_data() override;
}

这将覆盖A::get_dataB::get_data。为了"实际调用类 B read((">,你确实可以进行这样的调用:

int C::get_data() {
    return B::get_data();
}

或者......如果你没有宣布B::get_data私人的,这是可能的。

<小时 />

如果您稍微更改层次结构,则可以重写另一个基中的函数而不显式委派派生。特别是,您需要一个共同的基础和虚拟继承:

struct Base {
    virtual int get_data() = 0;
};
struct A : virtual Base {
    void print() {
        std::cout << get_data();
    }
};
struct B : virtual Base {
    int get_data() override {
        return 4;
    }
};
struct C : A, B {};