鉴于以下内容:
class A {
//
}
class B {
//
}
class Ad1 : public A {
//
}
class Ad2 : public A {
//
}
class Ad1B : public Ad1, public B {
//
}
class Ad2B : public Ad2, public B {
//
}
类型Ad1B和Ad2B共享一个公共继承接口(A和B的组合接口)。 是否可以创建指向Ad1B或Ad2B类型的对象的指针,并通过它可以访问此共享接口?有没有办法达到同样的效果?
答案 0 :(得分:1)
Ad1B
和Ad2B
的公共接口是A
和B
- 因此您可以存储指向类Ad1B
或{{1}的对象的指针} {分析} Ad2B
或A*p
分别访问B*p
或A
功能
答案 1 :(得分:0)
您想要一个指向不存在的基类的指针。您需要一些指向具有A
和B
组合接口的类型的指针。您必须创建具有该接口的新类型。
您可以选择三种方法:模板方法或接口方法或适配器方法。
模板方法非常简单。您需要该组合界面的函数只接收对T
的引用并使用您的对象。如果T
具有该组合接口,则将进行编译。它甚至可以与公共数据成员合作。
接口方法需要对类进行更改。您可以像这样创建该界面:
struct AB {
// Add virtual member function
// That is the combined version of A and B
};
现在Ad1B
和Ad2B
必须从AB
界面继承。
适配器是模板和界面的混合体。您必须具有与上面相同的界面AB
,但不是让Ad1B
和Ad2B
实现它,而是创建模板化适配器:
template<typename T>
struct Adapter : AB {
T& object;
// Override foo from AB
void foo() override {
object.foo();
}
};
然后,您可以在代码中使用AB
界面。你在哪里使用组合界面。