コードに比較的複雑なインターフェイスがあり、実装に多くの転送関数を記述せずに、実装の一部を別のクラスに委譲したいと考えています。この簡略化されたサンプル コードを参照してください。
#include <stdio.h>
struct Interface {
virtual void foo() = 0;
virtual void bar() = 0;
virtual ~Interface() {}
};
struct Delegate {
virtual void foo()
{ printf("foo\n"); }
};
struct Impl : public Interface, private Delegate {
// delegate foo to Delegate
using Delegate::foo;
void bar()
{ printf("bar\n"); }
};
int main() {
Interface* i = new Impl();
i->foo();
i->bar();
delete i;
return 0;
}
現在、G++ はfooが Impl に実装されていないと不平を言っています。ただし、Impl には完全に優れた関数fooがあり、別の親クラスから取得したものです。コンパイラが vtable を適切に埋めないのはなぜですか?
(注: この特定の例では、デリゲートがインターフェイスから派生できることを知っています。インターフェイスからデリゲートを派生させずに機能を委任できるかどうかを理解したいと思います。)