用并行基础 class 方法覆盖纯虚方法?

Override pure virtual method with parallel base class method?

说我有 class Foo 一个纯虚函数 say 和 class Bar 一个方法 say 我想要实现继承自 FooBar 的 class 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 直接用 Bar::say 覆盖 Foo::say?让 FooBar::say inline 能可靠地完成这个吗?我意识到我可以让 Bar 继承自 Foo 并且 FooBar 仅继承自 Bar 但这在实际项目中是不合适的,这个例子类似于.

#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."
}

这在虚拟继承中被称为支配

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


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

  • 初始化虚拟继承的common class sub-object,最上面的base class,在most derived class中指定。 class 继承链中间的规范将被忽略。
  • 成员函数调用可能会有一些开销,因为可能需要调整 this 指针。