Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
虚拟继承使用 我需要编写一个编码惯例,它将被新手和有经验的C++开发人员使用。动态多态性的继承规则如下所示: 对于动态多态性,考虑使用单继承(树状层次结构),可能具有多个抽象接口的继承性: 对于沿层次结构的继承(基类等),默认情况下,使用公共继承 对于抽象接口的继承,默认情况下,使用公共虚拟继承_C++_Oop_Inheritance_Multiple Inheritance - Fatal编程技术网

虚拟继承使用 我需要编写一个编码惯例,它将被新手和有经验的C++开发人员使用。动态多态性的继承规则如下所示: 对于动态多态性,考虑使用单继承(树状层次结构),可能具有多个抽象接口的继承性: 对于沿层次结构的继承(基类等),默认情况下,使用公共继承 对于抽象接口的继承,默认情况下,使用公共虚拟继承

虚拟继承使用 我需要编写一个编码惯例,它将被新手和有经验的C++开发人员使用。动态多态性的继承规则如下所示: 对于动态多态性,考虑使用单继承(树状层次结构),可能具有多个抽象接口的继承性: 对于沿层次结构的继承(基类等),默认情况下,使用公共继承 对于抽象接口的继承,默认情况下,使用公共虚拟继承,c++,oop,inheritance,multiple-inheritance,C++,Oop,Inheritance,Multiple Inheritance,此规则后面将有关于实施、可能的例外情况等的详细信息 这样,问题>强>这是对新手和有经验的C++开发者都需要的吗?(赞成/反对,以及源和链接都欢迎) 我看到的是: 赞成的意见: 规则易于新手使用,不限制有经验的开发人员 熟悉Java/.NET接口的人 回避与实现的虚拟继承(因为它是为抽象接口保留的)以及非虚拟继承(转换到接口类时可能存在歧义)相关的问题 欺骗: 轻微的性能成本(转换到接口时的速度、虚拟表的大小、类实例中的额外指针) 注:我已经阅读了以下在线来源: 注2:“

此规则后面将有关于实施、可能的例外情况等的详细信息

这样,问题>强>这是对新手和有经验的C++开发者都需要的吗?(赞成/反对,以及源和链接都欢迎)


我看到的是:

赞成的意见:
  • 规则易于新手使用,不限制有经验的开发人员
  • 熟悉Java/.NET接口的人
  • 回避与实现的虚拟继承(因为它是为抽象接口保留的)以及非虚拟继承(转换到接口类时可能存在歧义)相关的问题
欺骗:
  • 轻微的性能成本(转换到接口时的速度、虚拟表的大小、类实例中的额外指针)

注:我已经阅读了以下在线来源:

注2:“抽象接口”的名称是在Sutter&Alexandrescu在“C++编码标准”第36项中使用后产生的


这是一个应该工作的例子(使用接口的爪哇/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 *
}

是的,显式的铸造以消除歧义是错误的解决方案(显式铸造通常是错误的解决方案)。

< P>如果继承不是C++的继承,那么继承示例就不起作用了,因为C++中的经典多重继承问题。基本上,如果不指定虚拟继承,每个父类(B,C)都有自己的基A对象。这使得对非静态基类函数和变量的所有访问(转换以及im假设)都不明确。我无法想象在C++中你能避免这种情况。

编辑:对于记录,这是工作代码:

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

class B : virtual public A {};
class C : virtual public A {};

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

void foo(A * c) {}
void bar(D * d)
{
    foo(d);
}

int main(void)
{
    D d;
    foo(&d);
    return 0;
}

您的第一条规则根本不包括D类:

< >动态多态性,考虑使用单继承(树状层次结构),可能具有多个抽象接口的继承性< /P> 你的规则很好


那么,你的问题到底是什么?现在还剩下什么?

你知道吗?你已经给出了问题中所有的重要信息。在技术层面上,我看不到任何答案。显然,没有其他人看到你发布的内容有任何重大的技术问题

我会回答你的粗体问题:是的,它适合新手和专业人士

  • 新手有一些有用的技术指南
  • 如果专业人士能给出理由,他们可以做他们想做的事情,因为你用“考虑”和“默认”来限定你的规则,所以基本上没有人可以说你必须这么做,因为你的规则的措辞已经允许例外

我觉得不错。我还想添加一条规则:“尽可能避免OO多态性。尝试和”之类的替代方法,我认为实现继承通常应该是私有的(仅在必要时公开成员),并且只有在有充分理由不喜欢组合的情况下才进行。接口继承通常应该是非虚拟的,因为派生类通常是最终的。一般来说,保持继承尽可能简单(但不简单)。@user3034482:比较基类指针?为何在我的问题中我从来没有提到过,是吗?不管怎样,你还在为微观优化而斗争吗?当您的结构大于或等于500字节时,一个指针对性能的影响是什么?当一个虚拟函数调用执行一个可能跨越1ms或更长时间的长排序时,它的性能会受到多大的影响?禁用RTTI或异常?拜托,我们是在2013年,不是在1990年。。。如果我想要性能,我会删除所有的qsort调用并void*污染代码,然后用std::sort和functor替换。这不是重点,这里。@ USER 3034:2:代码>请看谷歌C++风格指南<代码>:我做到了。事实上,StackOverflow的很多排名前1%的人都这么做了,他们的评论并不是很积极。“谷歌C++风格参考”并不是C++的参考,而是“如果你是新手,不想学习,请使用这个子集,谢谢”。如果你想引用C++,请使用严肃的文档,比如萨特和Alxand ReScCube的C++编码标准,或者看看F-35“JSF C++编码标准”。@ USER 3034 82: <代码>他们不做RTTI和例外;这是有充分理由的。对于RTTI(规则是“避免”,没有提到效率,只有设计)。至于例外情况,这是一个基于谷歌的代码不是例外安全的事实的决定,这是一种礼貌的说法,可以说它很容易泄漏内存和资源,因此与其说是对代码状态的证明,不如说是对其他任何东西的证明。同样,效率很少被提及。