假设我的类Foo
包含纯虚函数say
,类Bar
包含方法say
,我想实现继承的FooBar
类来自Foo
和Bar
,Foo::say
被Bar::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
继承Foo
而FooBar
仅从Bar
继承,但这在实际项目中并不适用于此示例类似于。
答案 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
指针。