Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.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++_Multiple Inheritance - Fatal编程技术网

C++多重继承(菱形方案)范式

C++多重继承(菱形方案)范式,c++,multiple-inheritance,C++,Multiple Inheritance,我在多重继承菱形方案下组织了4个类 BASE / \ / \ Deriv1 Deriv2 \ / \ / Final 例如,我对每个类都有ShowXXXX方法,其中“XXXX”是类的名称 当我调用ob.ShowFinal方法时,它会打印: 期末考试的字段, Deriv1的字段, 基地的田地, Deriv2的字段

我在多重继承菱形方案下组织了4个类

             BASE
             /  \
            /    \
        Deriv1  Deriv2
            \    /
             \  /
             Final
例如,我对每个类都有ShowXXXX方法,其中“XXXX”是类的名称

当我调用ob.ShowFinal方法时,它会打印:

期末考试的字段, Deriv1的字段, 基地的田地, Deriv2的字段, 基地场 问题是我想第二次逃离打印基地的字段。 但是,有一个范例:因为当我调用ob.ShowDeriv2时,它应该被打印出来:

Deriv2的字段, 基地场 当我调用ob.ShowDeriv1时,应该打印:

Deriv1的字段, 基地场 我的代码:


谢谢你的帮助

在您的问题中几乎没有限制,因此这应该是可行的

将中间层1和2中的声明更改为

public:
    void ShowIntermediate1(bool printBase = true);
在实施过程中:

...
if (printBase)
 ShowBase();
然后在ShowFinal中:


也许你想要的答案是。这是为了解决这个问题。但是您应该将代码更改为使用虚拟方法。

您可以使用虚拟继承来确保Final只获取一个基本子对象,而非虚拟继承情况下仅获取两个基本子对象。但是虚拟继承确实有成本——它增加了Deriv1和Deriv2子对象的大小,而且使用起来有些复杂。我忍不住想,但你的设计有一个更根本的问题。你到底想做什么?所有的Show*方法都是用来调试的吗?它闻起来有点像你在使用继承,而你应该使用组合。你能解释一下你想用这个代码解决什么问题吗?我应该做一项由我的教授在实验室培训课程上提出的工作。这是一个简单的例子,他说尝试在菱形下进行多重继承form@Insilico而且使用起来有点复杂。什么样的并发症?
...
if (printBase)
 ShowBase();
ShowIntermediate1(true);
ShowIntermediate2(false);