首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >c++:多重继承和接口

c++:多重继承和接口
EN

Stack Overflow用户
提问于 2022-06-23 06:37:19
回答 2查看 115关注 0票数 -1

见以下代码:

代码语言:javascript
复制
#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:

代码语言:javascript
复制
#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接口?

EN

回答 2

Stack Overflow用户

发布于 2022-06-23 07:04:34

您可以考虑将A 分为两个接口:

代码语言:javascript
复制
struct A1 {  // Interface1
    virtual void a() = 0;
    virtual ~A1() {}
};

struct A2 {  // Interface2
    virtual void x() = 0;
    virtual ~A2() {}
};

以这种方式:

a().

  • Make

  • 使B继承A1,实现B C从A2继承(以实现x()),并从B继承A1的实现

见下文:

代码语言:javascript
复制
#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?

票数 2
EN

Stack Overflow用户

发布于 2022-06-23 08:04:57

根据您想要实现的目标,您可以使用类并将函数设为B专用,这样就没有人可以尝试使用它了。类似于:

代码语言:javascript
复制
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; }
};

其他可能的解决办法是:

  • 将B作为C的一个成员,因此您可以调用B.a()而不是多重继承,以减少读者对

的困惑

代码语言:javascript
复制
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();
}

您可以使用函数指针,但这意味着函数必须是静态的,并且基类成为抽象类。

代码语言:javascript
复制
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; }
};
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72725579

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档