见以下代码:
#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类中创建一个()。
更新:我更正了代码,以说明为什么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接口?
发布于 2022-06-23 07:04:34
您可以考虑将A 分为两个接口:
struct A1 { // Interface1
virtual void a() = 0;
virtual ~A1() {}
};
struct A2 { // Interface2
virtual void x() = 0;
virtual ~A2() {}
};以这种方式:
a().
B继承A1,实现B C从A2继承(以实现x()),并从B继承A1的实现见下文:
#include <iostream>
struct B : public A1 {
virtual void a() override { std::cout << "B" << std::endl; }
};
struct C : public A2, public B {
virtual void x() override { std::cout << "x" << std::endl; }
};
int main() {
C c;
c.a();
c.x();
}注意:我向基类添加了虚拟析构函数。看这里的原因:When to use virtual destructors?。
发布于 2022-06-23 08:04:57
根据您想要实现的目标,您可以使用类并将函数设为B专用,这样就没有人可以尝试使用它了。类似于:
class A { // Interface
public:
virtual ~A() {}
virtual void a() = 0;
virtual void x() = 0;
};
class B : public A{
private:
void x() { std::exception("Not Implemented"); };
public:
~B() override{}
void a() override { std::cout << "B" << std::endl; }
};
class C : public B {
public:
~C() override{}
void x() override { std::cout << "x" << std::endl; }
};其他可能的解决办法是:
的困惑
struct A { // Interface
virtual ~A() {}
virtual void a() = 0;
virtual void x() = 0;
};
struct B {
virtual void a() { std::cout << "B" << std::endl; }
};
struct C : A {
B b;
virtual ~C() override {}
void a() override { b.a(); }
void x() override { std::cout << "x" << std::endl; }
};
int main() {
C c;
c.a();
c.x();
}您可以使用函数指针,但这意味着函数必须是静态的,并且基类成为抽象类。
struct A { // Interface
virtual ~A() {}
virtual void x() = 0;
typedef void(*aFunction)();
aFunction a;
A() { a = nullptr; }
};
struct B {
static void a() { std::cout << "B" << std::endl; }
};
struct C : A {
virtual ~C() {}
void x() override { std::cout << "x" << std::endl; }
C() { a = B::a; }
};https://stackoverflow.com/questions/72725579
复制相似问题