首页 文章

基类列表是指示虚拟继承的正确位置吗?

提问于
浏览
1

我从未见过用作虚拟和非虚拟基类的类(即,如果某些类旨在成为祖先,那么我们通常事先知道继承类型 - 虚拟或非虚拟) .

所以我认为在c中有一个容易出错的自由来专门化基类列表中的“虚拟”继承 . 将基类本身指定为“虚拟”应该更好

或许我错了?

如果不是,有人可以描述一些技术来防止这种“虚拟”类的意外非虚拟继承吗?

或者即将推出的c标准有一些观点?

(对不起,如果重复)


一些例子

1)ReferenceCounted类作为一些基于引用计数的smartpointer可以指向的所有类的基础 . 我们需要防止这个基本实例(和引用计数器)的重复 . 除了优化之外,没有理由将此类用作非虚拟基础 .

2)接口层次结构和相应的实现层次结构(在这种情况下,接口层次结构必须是“虚拟”)

// interfaces:

struct BaseIface{
  void virtual func()=0;
};

struct DerivedIface: public virtual BaseIface{
  void some_another_func()=0;
}


// implementations

class BaseImpl: public virtual BaseIface{
  void virtual func(){....};
}

class DerivedImpl: public BaseImpl, public virtual DerivedIface{
  void some_another_func(){...};
}

我怀疑在许多情况下非虚拟继承不是概念上的需要,它只用于减少虚拟继承开销(有时候是为了使static_cast <>能够驱动:)

请注意,Java只使用虚拟(就c而言)接口的继承,我不知道有任何抱怨这种语言缺乏“非虚拟”(它本质上不如c表达语言,但这个“功能”不是它的主要错:) .

1 回答

  • 1

    在基类中你没有太多的方法可以做到这一点(你也不是真的想要) . 为虚拟和非虚拟继承使用基类是完全合理的 .

    您真正喜欢的是在最派生类中指定虚拟继承,其中当前必须在中间类中指定 . 不幸的是,我最终得到的东西几乎就像 export ,您可能需要返回并根据指定虚拟继承的最派生类重新编译这些中间类(并且有一些方法来存储以两种方式编译的中间类因为它可以使用其中一种或两种方式) .

相关问题