用并行基类方法覆盖纯虚方法?

时间:2018-02-21 13:56:32

标签: c++ override multiple-inheritance pure-virtual

假设我的类Foo包含纯虚函数say,类Bar包含方法say,我想实现继承的FooBar类来自FooBarFoo::sayBar::say覆盖。我可以做如下的事情:

#include <iostream>

class Foo {
public:
    virtual void say() = 0;
};

class Bar {
public:
    void say() {
        std::cout <<"I am a Bar." << std::endl;
    }
};

class FooBar : public Foo, public Bar {
public:
    void say() override {
        Bar::say();
    }
};

int main() {
    FooBar foobar;
    foobar.say();  // I want to print "I am a Bar."
    return 0;
}

但这只会使FooBar::say成为调用Bar::say的函数。这是一个非常小的烦恼但有没有办法让FooBar直接用Foo::say覆盖Bar::say?让FooBar::say inline可靠地完成此操作吗?我意识到我可以Bar继承FooFooBar仅从Bar继承,但这在实际项目中并不适用于此示例类似于。

1 个答案:

答案 0 :(得分:1)

#include <iostream>

class ISay {
public:
    virtual void say() = 0;
};

class Bar: public virtual ISay {
public:
    void say() override {
        std::cout <<"I am a Bar." << std::endl;
    }
};

class FooBar : public virtual ISay, public Bar {};

int main() {
    FooBar foobar;
    foobar.say();  // Prints "I am a Bar."
}

这在虚拟继承中称为支配

有些人认为,为了支持这一点,人们应该总是虚拟地继承接口。

虚拟继承有两个主要成本(可能更多):

  • 在最派生的类中指定了虚拟继承的公共类子对象(最上层的基类)的初始化。继承链中间类中的规范将被忽略。
  • 成员函数调用可能会有一些开销,因为可能需要调整this指针。