防止孙子调用其祖父母的方法
我有一个简单的父类和基类:
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。