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

时间:2019-03-31 21:58:13

标签: c++ inheritance virtual-method

  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 个答案:

答案 0 :(得分:2)

  

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

     
      
  1. 这会发生吗?
  2.   

是的

  

所以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 {};