作者:执子之手2502891083 | 来源:互联网 | 2023-09-06 12:50
我有一个简单的父类和基类:
class X
{
public:
virtual void Method(){...}
};
class Z : public X
{
public:
virtual void Method(){ X::Method(); }
};
我想重构它,以便一个新类Y
位于类层次结构之间,因此Z : Y
, Y : X
. Z::Method()
现在应该调用Y::Method()
not X::Method()
。但是如果我不改变它,它仍然可以编译。事实上,我有很多这样的方法,X::...
在重构时很容易错过调用,这会导致难以发现的错误。
有没有办法让编译器提醒我,换句话说,使X
的方法可以访问Y
,但隐藏起来Z
?
澄清一下,这可能只是在我进行重构以确保不会遗漏任何内容时的临时更改。
回答
但是如果我不改变它,它仍然可以编译。事实上,我有很多这样的方法,在重构时很容易错过对 X::... 的调用,这会导致很难找到错误。
澄清一下,这可能只是在我进行重构以确保不会遗漏任何内容时的临时更改。
正如您所描述的“重构时”,您可以临时添加一个不完整的类型X
来Z
隐藏超类X
在层次结构中的位置:
class Z : public Y {
private:
struct X; // TODO(Mr. Boy): remove after finishing re-factoring.
public:
void Method() override { X::Method(); } // error! Z::X is incomplete
};
任何限定的X::...
in使用都Z
将失败,因为查找解析为不完整的嵌套类型X
。