假设我有一些 A 类:
// a.h:
class A {
virtual unsigned foo() {
return 0;
}
然后,我有许多继承自 A 的类(我们称之为中间体)(B 类、C 类...等)。这些类永远不会覆盖 foo()。
// b.h:
class B : public A {
bool override_foo = true;
// ....
}
// c.h:
class C : public A {
bool override_foo = false;
}
然后,我有很多继承自中间体的类。 D 类、E 类等。如果这些类从单个中间体继承,则只有一个,即这些类和中间体之间存在 1 对 1 的关系。保证只有(并且总是)这些类中只有一个继承自中间体之一。
现在,这些类可以覆盖 foo。但是,如果它们这样做,并且它们继承的中间类未将 override_foo 定义为 true,则我需要编译失败。
例如,如果我们有 D 类:
// d.h:
class D : public B {
unsigned foo() override();
}
编译会顺利进行,因为 B 已将 override_foo 定义为 true。
但是,我们应该会失败:
// e.h:
class E : public C {
unsigned foo() override();
}
因为 C 的 override_foo 为 false。
这是可以实现的吗?不幸的是,这个问题的灵 active 很小。我在一家公司工作,中级类(class)(B、C)可以稍微改变。它们是通过专有框架的编译而创建的。我可以向其中添加一个成员,或者任何类型的宏魔法。基类 A 也是如此。但是,孙子类 D、E 是由其他工程师定义的,用于覆盖框架的部分内容,我需要阻止他们这样做,除非中间类具有一些关键属性。
谢谢!
最佳答案
您可以使用final
关键字来禁止继承类重写该方法。
class A {
public:
virtual ~A() = default;
virtual void foo() {}
};
class B : public A {
public:
void foo() final { A::foo(); }
};
class C : public A {};
class D : public B {
public:
void foo() override; // <- compilation error here
};
class E : public C {
public:
void foo() override;
};
int main() {}
关于c++ - 在编译时判断虚方法是否被重写,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60696692/