问题描述
最初基类 B 是从类 A 派生的。但是由于 C 派生自 A 和 B,我陷入了令人讨厌的菱形继承,因此删除了 B 中的继承,选择了到 A 的转换函数。
现在我收到了关于 typ 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;}
^
解决方法
给定一个 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(); }
};