使用姐妹继承
using sister inheritance
让我们假设一些(遗留的)代码,不能被触及,声明
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 未定义)
直接在C++中,不可能基于B的函数与A的某种隐式匹配来多态调度。 你可以使用 gccxml 或其他类似产品进行某种代码生成,但如果只有一个函数,一个宏无论如何都可以减少转发到单行 - 不值得引入额外的工具,除非你有成千上万的这些工具要做。
实现委托给B
的A
:
class A_Impl : public A
{
public:
virtual void f()
{
b.f();
}
private:
B b;
}
通过从A_Impl
派生来实现C
:
class C: public A_Impl
{
};
或者,如果您只想在继承层次结构中显示A
,请公开从A
派生,私下从A_Impl
派生:
class C: public A, private virtual A_Impl
{
};
你可以做这样的事情:
void C::f() {
B* b = this;
b->f();
}
不,你不能那样做。从你向我们展示的片段来看,B
应该是C
的成员,而不是继承。你只需要编写一些转发函数(或一个脚本来自动生成它们)。
因此,你在 A 中有 100 个纯虚函数,在 B 中有这些函数的实现,并且您希望避免在 C 中编写重新实现所有这些函数来调用 B。没有办法让编译器自动使用 B 的实现。与其与编译器争吵(你每次都会输!),不如重新考虑继承图。也许使 B 成为 A 的子类,然后从 B 导出 C。或者将 B 中的 100 个方法分解为 A 的具体子类。
编程是在工具提供的约束内解决问题的艺术。当你发现自己与你的工具不一致时,你需要重新考虑你解决问题的方法或使用不同的工具。
相关文章:
- 继承函数的重载解析
- 继承期间显示未知行为的子类
- 头文件-继承c++
- 为什么在保护模式下继承升级不起作用
- 通过继承类使用来自不同命名空间的运算符
- 子目录是否继承属性,例如add_definitions,include_directories和父Cmakelist.t
- 混合组合和继承的C++问题
- 继承:构造函数,初始化C++11中基类的类C数组成员
- 从类继承时,继承的类是否会通过父类重新定义继承的变量
- 公共与私人继承
- 如何创建从同一类继承的不同对象的向量
- 如何从另一个文件继承私有成员变量和公共函数
- 在模板基类中为继承类中的可选重写生成虚拟方法
- 带有继承的C++工厂
- 我应该避免多重实现继承吗
- C++继承更改成员
- 从具有默认值的部分指定模板类继承时发生SWIG错误,具有不带默认值的正向声明
- 关于C++中具有多重继承"this"指针的说明
- 尝试使用继承和模板实现CRTP.Visual Studio正在生成编译器错误
- 使用姐妹继承