【问题标题】:How to ensure a class derives only from predefined set of derived classes? [closed]如何确保一个类只派生自一组预定义的派生类? [关闭]
【发布时间】:2018-03-29 22:53:16
【问题描述】:

我什至不确定这是否可以做到。然而,这就是眼前的情况。

我有一个基类:

class Base {
public:
    virtual void fun();
private:
    int variable;
}

假设我有两个派生类:

class Derived1 : public Base {
public:
    virtual void fun() override;
    virtual void moreFun();
private:
    int variable;
}

class Derived2 : public Base {
public:
    virtual void fun() override;
    virtual void moreFun();
private:
    int variable;
}

我想写一个类 Derived3 可以从 Derived1派生2

这个想法是让 Derived3 在其他派生类之一之上扩展某些功能。我不打算在运行时切换类,但想以类似于模板的方式进行初始化。

Template <class T>
class Derived3 : public T {
public:
    virtual void moreFun() override;
private:
    int variable;
}

是否可以确保类 Derived3 只能从 Derived1Derived2 派生?

【问题讨论】:

  • 模板解决方案在哪些方面不适合您?
  • 派生类只是一个例子。它们有很多执行不同任务的虚拟函数。
  • 这听起来有点像 XY 问题。关于什么不起作用的更多细节应该很好。听起来封装或依赖注入(可能通过模板)会起作用,但我不能说没有更多信息。
  • @AravindEV - downvoter 的观点是,如果某个类可以选择从两个基类派生,那么使用该派生类的所有代码只有在使用两个基类共享的成员函数时才会编译。调用Derived1的任何不是Derived2的成员函数的成员函数,代码根本无法编译。
  • 这样做可能不是最好的主意……因为如果您超过上述 4 个相关的类,它会使代码难以维护。改用聚合可能更好。 阅读关于设计、模式和反模式的好书也可能是个好主意。

标签: c++ class c++11 templates inheritance


【解决方案1】:

static_assertstd::is_base_of 将为您提供所需的一切。只需将其添加到类正文中,不要忘记包含文件:

#include <type_traits>

    ...
    static_assert(std::is_base_of<Base, T>(), "T in Derived3<T> must inherit from Base");
    ...

如果您只想允许特定的派生类而不是所有派生类,或者想要禁止Base 本身,请查看std::is_same

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-22
    • 1970-01-01
    • 2023-04-04
    • 2017-05-04
    • 2012-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多