虚拟继承使用 我需要编写一个编码惯例,它将被新手和有经验的C++开发人员使用。动态多态性的继承规则如下所示: 对于动态多态性,考虑使用单继承(树状层次结构),可能具有多个抽象接口的继承性: 对于沿层次结构的继承(基类等),默认情况下,使用公共继承 对于抽象接口的继承,默认情况下,使用公共虚拟继承
此规则后面将有关于实施、可能的例外情况等的详细信息虚拟继承使用 我需要编写一个编码惯例,它将被新手和有经验的C++开发人员使用。动态多态性的继承规则如下所示: 对于动态多态性,考虑使用单继承(树状层次结构),可能具有多个抽象接口的继承性: 对于沿层次结构的继承(基类等),默认情况下,使用公共继承 对于抽象接口的继承,默认情况下,使用公共虚拟继承,c++,oop,inheritance,multiple-inheritance,C++,Oop,Inheritance,Multiple Inheritance,此规则后面将有关于实施、可能的例外情况等的详细信息 这样,问题>强>这是对新手和有经验的C++开发者都需要的吗?(赞成/反对,以及源和链接都欢迎) 我看到的是: 赞成的意见: 规则易于新手使用,不限制有经验的开发人员 熟悉Java/.NET接口的人 回避与实现的虚拟继承(因为它是为抽象接口保留的)以及非虚拟继承(转换到接口类时可能存在歧义)相关的问题 欺骗: 轻微的性能成本(转换到接口时的速度、虚拟表的大小、类实例中的额外指针) 注:我已经阅读了以下在线来源: 注2:“
这样,问题>强>这是对新手和有经验的C++开发者都需要的吗?(赞成/反对,以及源和链接都欢迎)
我看到的是: 赞成的意见:
- 规则易于新手使用,不限制有经验的开发人员
- 熟悉Java/.NET接口的人
- 回避与实现的虚拟继承(因为它是为抽象接口保留的)以及非虚拟继承(转换到接口类时可能存在歧义)相关的问题
- 轻微的性能成本(转换到接口时的速度、虚拟表的大小、类实例中的额外指针)
注:我已经阅读了以下在线来源:
这是一个应该工作的例子(使用接口的爪哇/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> 你的规则很好
那么,你的问题到底是什么?现在还剩下什么?你知道吗?你已经给出了问题中所有的重要信息。在技术层面上,我看不到任何答案。显然,没有其他人看到你发布的内容有任何重大的技术问题 我会回答你的粗体问题:是的,它适合新手和专业人士
- 新手有一些有用的技术指南
- 如果专业人士能给出理由,他们可以做他们想做的事情,因为你用“考虑”和“默认”来限定你的规则,所以基本上没有人可以说你必须这么做,因为你的规则的措辞已经允许例外