c++ - 在编译时判断虚方法是否被重写

标签 c++ templates template-meta-programming

假设我有一些 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/

相关文章:

c++ - 从模板类继承

C++: "trait"和 "meta-function"是同义词吗?

c++ - 生成模板实例列表并在其上调用静态函数

c++ - PNACL——使用 winscard 库

c++ - 为什么代码片段会抛出浮点异常?

c++ - 什么叫表达式 `T (&some(...)) [2]` where T=char

c++ - 为什么我的out_of_range异常没有被捕获

c++ - 元组的定义和初始化,其组件属于相同的模板类,但具有不同的特化

c++ - 如何强制清除 STL 内存缓存?

c++ - 为什么我的顶点缓冲区对象出现访问冲突错误?