【发布时间】:2022-08-12 00:58:36
【问题描述】:
请参见以下代码:
#include <iostream>
struct A { // Interface
virtual void a() = 0;
virtual void x() = 0;
};
struct B {
virtual void a() { std::cout << \"B\" << std::endl; }
};
struct C : A, B {
void a() override { B::a(); }
void x() override { std::cout << \"x\" << std::endl; }
};
int main() {
C c;
c.a();
c.x();
}
此代码有效。问题是它是否是最佳/最佳解决方案。
我想知道是否有任何技巧可以让我不在 C 类中创建 a() 。
更新:我更正了代码以说明为什么 B 不能从 A 继承。
更新 2:
#include <iostream>
struct I1 {
virtual void i1() = 0;
};
struct I2 {
virtual void i2() = 0;
};
struct I3 : I1, I2 {};
struct A : I1 {
void i1() override { std::cout << \"i1\" << std::endl; }
};
struct B : A, I2 {
void i2() override { std::cout << \"i2\" << std::endl; }
};
int main() {
B b;
b.i1();
b.i2();
I3* ptr = dynamic_cast<I3*>(&b); // warning: dynamic_cast of ‘B b’ to ‘struct I3*’ can never succeed
std::cout << ptr << std::endl;
}
问题是:如何通过接口传递指向\'b\'的指针?为什么 b 不能转换为 I3 接口?
-
是的。使 \'B\' 从 \'A\' 继承并完全跳过多重继承。
-
你说的最好是什么意思?请注意,有两个虚拟方法,都被
C::a覆盖,这是你想要的吗? -
什么的最佳/可选解决方案?您发布的代码只是做了它所做的事情,但您没有说出您真正想要实现的目标。
-
您可以将
A拆分为 2 个接口 - 一个可以由B派生和实现。那么C可以继承B(用于实现a)和新的拆分接口(用于实现x)。