虚拟继承使用

 骑着母猪去相亲 发布于 2023-02-13 14:08

我需要编写一个将由新手和经验丰富的C++开发人员使用的编码约定.动态多态的继承规则如下:

对于动态多态,请考虑使用单继承(树状层次结构),可能具有抽象接口的多重继承

对于继承层次结构(基类等),默认情况下使用公共继承

对于继承抽象接口,默认情况下使用公共虚拟继承

此规则之后将提供有关实施,可能的例外等的详细信息.

所以,问题是这个规则是否适合新手和经验丰富的C++开发人员?(欢迎/利弊,以及来源和链接是受欢迎的)


我看到的是:

优点:

规则易于新手使用,不限制经验丰富的开发人员.

对那些已经熟悉Java/.NET接口的人来说很熟悉

避免与实现的虚拟继承相关的问题(因为它是为抽象接口保留的),以及非虚拟继承(在转换为接口类时可能存在歧义)

缺点:

轻微的性能成本(转换到接口时的速度,虚拟表的大小,类实例中的附加指针)


注意:我已阅读以下在线资源:

当虚拟继承是一个好的设计?

http://www.parashift.com/c++-faq-lite/virtual-inheritance-abcs.html

http://www.artima.com/intv/abcs.html

http://cpptips.com/virt_inher2

http://g.oswego.edu/dl/mood/C++AsIDL.html

注2:在"C++编码标准"第36项中使用Sutter&Alexandrescu后,使用"抽象接口"名称


这是一个应该工作的情况(它的Java/C#等效使用接口工作),但如果接口继承不是虚拟的,那么在C++中就不会这样:

class A
{
   public :
      virtual ~A() = 0 {}
} ;

class B : public A {} ; // should have been virtual to avoid the error
class C : public A {} ; // should have been virtual to avoid the error

class D : public B, public C
{
   public : 
      virtual ~D() {}
} ;

void foo(A * c) {}
void bar(D * d)
{
   foo(d) ; // Error: ambiguous conversions from 'D *' to 'A *
}

是的,显式转换以消除歧义是错误的解决方案(无论如何,显式转换通常是错误的解决方案).

撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有