【问题标题】:Fix warning "unused conversion function" in derived class修复派生类中的警告“未使用的转换函数”
【发布时间】:2021-10-02 07:37:02
【问题描述】:

最初基类 B 是从类 A 派生的。但是由于 C 从 A 和 B 派生,我陷入了令人讨厌的菱形继承,因此删除了 B 中的继承,选择了到 A 的转换函数。

现在,由于从未使用过转换为基类,我收到了 C 类类的警告。我该如何修复或删除这些?程序运行没有问题。

// base class providing most functionality
class A{
public:
int doStuff(){ return 0; };
};

// pure virtual interface providing a conversion to A
class B{
public:
virtual operator A&()=0;
};

// interface implementation
class C: public A, public B{
public:
virtual operator A&() override{return *this;}
};

警告:将永远不会使用将“C”转换为其基类“A”的转换函数

        virtual operator A&() override{return *this;}
                ^

【问题讨论】:

  • 那么虚拟继承呢?如果BC 几乎都继承自A,那么您将在C 中得到一个A 实例...
  • C c; A& a = c; 不会使用你的operator A&;使用其他命名可能是可能的。
  • 也许更简单:B 是否有任何理由不应该公开A 继承?如果不是,就这样做,如果C 然后从B 公开继承,它会自动从A 继承,那么为什么要显式地从A 再次继承呢?
  • 因为我的情况有点复杂,其中 C 不是从 A 继承,而是从 A 派生的类。不同的典型 C 类都继承自从 A 派生的不同类。接口 B 仅用于 A 提供的方法。
  • 那么,您应该这样描述您的问题:D 继承自 BC,其中后两者都继承自 A。但话又说回来:让BC虚拟地A 继承,你就没有麻烦了:D 接收A 的单个实例。还是您无法修改C(显然您可以修改B)?

标签: c++ inheritance multiple-inheritance compiler-warnings


【解决方案1】:

给定C 的实例,您的编译器完全能够将其转换为对A 的引用,而无需此转换函数。将使用隐式转换,并且永远不会使用此运算符重载,这就是编译器诊断所说的字面意思。

如果您的目标是让B 的方法获得对相关A 对象的引用,那么简单的解决方案是为此使用常规函数,而不是重载运算符:

class B{
public:
virtual A& get_a()=0;
};

// interface implementation
class C: public A, public B{
public:
virtual A& get_a() override{return *this;}
};

B 中的其他方法只需要显式使用get_a()。但是,如果您愿意:

class B{
public:
virtual A& get_a()=0;
operator A&() { return get_a(); }
};

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-04
    • 1970-01-01
    • 2019-10-31
    • 2020-07-16
    相关资源
    最近更新 更多