相关疑难解决方法(0)

在C++中,什么是虚拟基类?

我想知道" 虚拟基类 "是什么以及它意味着什么.

让我举个例子:

class Foo
{
public:
    void DoSomething() { /* ... */ }
};

class Bar : public virtual Foo
{
public:
    void DoSpecific() { /* ... */ }
};
Run Code Online (Sandbox Code Playgroud)

c++ virtual-inheritance

389
推荐指数
6
解决办法
30万
查看次数

钻石问题

关于钻石问题的维基百科:

"......当两个B和C类继承自A,而D类继承自B和C时,钻石问题就会产生歧义.如果D中的方法调用A中定义的方法(并且不重写方法) ),B和C以不同的方式覆盖了该方法,然后从哪个类继承:B或C?"

所以钻石看起来像这样:

  A
 / \
B   C
 \ /
  D
Run Code Online (Sandbox Code Playgroud)

我的问题是,如果没有这样的A类会发生什么,但B和C再次声明相同的方法,比如说foo().这不是同一个问题吗?为什么它被称为钻石问题?

例:

class B {
    public void foo() {...}
}

class C {
    public void foo() {...}
}

class D extends B, C {
}

new D().foo();
Run Code Online (Sandbox Code Playgroud)

oop inheritance diamond-problem

27
推荐指数
2
解决办法
1万
查看次数

钻石继承(C++)

我知道钻石继承被认为是不好的做法.但是,我有2个案例,我认为钻石继承可以很好地适应.我想问一下,您是否会建议我在这些情况下使用钻石继承,或者是否有其他设计可能更好.

案例1:我想在我的系统中创建代表不同类型"动作"的类.这些操作按以下几个参数进行分类:

  • 动作可以是"读取"或"写入".
  • 动作可以延迟或没有延迟(它不仅仅是1个参数.它会显着改变行为).
  • 动作的"流类型"可以是FlowA或FlowB.

我打算有以下设计:

// abstract classes
class Action  
{
    // methods relevant for all actions
};
class ActionRead      : public virtual Action  
{
    // methods related to reading
};
class ActionWrite     : public virtual Action  
{
    // methods related to writing
};
class ActionWithDelay : public virtual Action  
{
    // methods related to delay definition and handling
};
class ActionNoDelay   : public virtual Action  {/*...*/};
class ActionFlowA     : public virtual Action  {/*...*/};
class ActionFlowB     : public …
Run Code Online (Sandbox Code Playgroud)

c++ oop inheritance multiple-inheritance diamond-problem

19
推荐指数
3
解决办法
1万
查看次数