让我们假设一些(遗留)代码,无法触及,声明
struct B{
public:
void f(){}
};
让我们假设有
struct A{
public:
virtual void f()=0;
};
是否可以在不显式调用f()的情况下调用A子类调用B :: f,即代替
struct C: public A, public B{
void f(){
B::f();
}
};
有像
这样的东西 struct C:virtual public A,virtual public B{
};
(请注意,最后一个类是抽象的,因为编译器A :: f未定义)
答案 0 :(得分:1)
直接在C ++中,不可能基于B函数与A的隐式匹配来进行多态分派。您可以使用gccxml或其他类似产品来进行某种代码生成,但如果只有一百个函数,宏可以减少转发到单行程 - 除非您有成千上万的工具,否则不值得引入额外的工具这些要做。
答案 1 :(得分:1)
实施代理A
的{{1}}:
B
通过派生class A_Impl : public A
{
public:
virtual void f()
{
b.f();
}
private:
B b;
}
:
C
A_Impl
或者,如果您只想在继承层次结构中显示class C: public A_Impl
{
};
,请从A
公开派生,并从A
私下派生:
A_Impl
答案 2 :(得分:0)
您可以执行以下操作:
void C::f() {
B* b = this;
b->f();
}
答案 3 :(得分:0)
不,你不能这样做。从您向我们展示的片段看来,B
应该是C
的成员,而不是继承。您只需编写一些转发函数(或自动为您生成它们的脚本)。
答案 4 :(得分:-1)
所以,你在A中有100个纯虚函数,B中那些函数的实现,你想避免在C中重写所有这些函数来调用B.没有办法让编译器使用B的实现自动。而不是与编译器斗争(你每次都会失败!),重新考虑继承图。也许使B成为A的子类,然后从B派生出来。或者将B中的100个方法分解为A的具体子类。
编程是在工具提供的约束内解决问题的艺术。当您发现自己与工具不一致时,您需要重新考虑解决问题的方法或使用不同的工具。