假设我在C ++中有以下类层次结构:
class AbstractBaseClass
{
public:
// Note: Class is completely abstract! No data!
AbstractBaseClass() {}
virtual ~AbstractBaseClass() {}
virtual std::string definedInVirtual() = 0;
virtual std::string definedInDerived() = 0;
};
class Virtual : public virtual AbstractBaseClass
{
public:
Virtual() {}
virtual ~Virtual() {}
std::string definedInVirtual()
{
return "definedInVirtual";
}
};
class DerivedA : public Virtual
{
public:
DerivedA() {}
virtual ~DerivedA() {}
std::string definedInDerived()
{
return "definedInDerivedA";
}
};
class DerivedB : public Virtual
{
public:
DerivedB() {}
virtual ~DerivedB() {}
std::string definedInDerived()
{
return "definedInDerivedB";
}
};
在这种情况下,在definedInVirtual()
或DerivedA
上调用DerivedB
,通过交叉授权调用definedInVirtual()
上Virtual
的定义。这是一种代码重用形式。
此方法有哪些缺点?在这种情况下,有没有更好的方法来实现代码重用?
修改
我要问的主要原因是有一个非常大的类,有人通过继承(他后悔这样做,但是类很大)的代码重用计划开发了一个由新的ABC超级分类将从新ABC派生的装饰器添加到对象层次结构中。我需要向新的ABC添加需要由DerivedA和DerivedB处理的方法,以及装饰器通过调用ABC的内部实例来处理。我的想法是使用上述技术......
答案 0 :(得分:5)
代码重用应该通过组合而不是继承来实现。虚拟继承缓慢而且非常混乱,几乎所有设计都应该避免。
答案 1 :(得分:1)
在我写这个答案的时候,你的问题有一些未定义和非常罕见的术语,“交叉授权”和“超级代理”(在C ++中没有意义),你的课程没有意义:什么是虚拟继承?
所以,我很抱歉,但到目前为止唯一能说的就是避免所提出的代码中的不良内容:
const
,请添加const
。在你的情况下,至少你已经在这一点上展示了什么,虚拟继承根本不用于任何事情(关于“交叉授权”的评论可能是它,但它没有意义),这很简单:删除virtual
关键字:它在这里没有任何用处。
您可以尝试使用更相关的示例修改您的问题,而不使用流行语。
(理想情况下,这应该是一个评论,但对于SO评论来说太长了。哎呀,消极性。不完全快乐 - 快乐或伪技术正面!现在匿名的驱逐者可能会受到驱动,受到启发“天气预报员”。好吧。)
干杯&第h。,