c ++使用" diamond"访问基类成员继承语法

时间:2018-04-29 16:13:50

标签: c++

假设,我想创建一个类似下面的类,并且不使用虚拟继承。 访问" upper"的语法是什么?来自" lower"的班级成员实例? 有一些左右方面的数字,但不确定哪个是"规范"正确。如何访问成员下层---上层?

/*       upper
        /  |  \
     left  |  right
        \  |  /
         lower
*/

class upper {
public:
int base;};

class left : public upper  {};

class right : public upper {};

class lower : public right, public left, public upper {};

int main(){

lower a;

// a.base=1;        // error: request for member 'base' is ambiguous
// a.upper::left::lower::base=1;    // error: 'upper::left' has not been declared
// a.lower::left::upper::base=2;    // error: 'upper' is an ambiguous base of 'lower'
// a.left::upper::base=1;           // error: 'upper' is an ambiguous base of 'lower'

// a.lower::upper::base=1;  // error: 'upper' is an ambiguous base of 'lower'
// a.upper::lower::base=1   // error: 'upper::lower' has not been declared

a.lower::left::base=1;  // works
a.right::base=1;        // works

return 0;}

感谢。

P.S。我已经读过使用它的危险。 :)

1 个答案:

答案 0 :(得分:5)

这不是钻石计划,这是一个“被诅咒的钻石”。继承菱形没有从基类到大多数派生类的直接行。由于模糊的继承,您无法以任何方式访问upper。而且你已经在两个“侧翼”类中有两个上层实例。

有些人可能会期待

a.lower::upper::base = 1; 

应该有效。它不应该。 lower作为命名空间包含来自upperleft的两个right以及来自其声明的一个upper。虽然您可以为leftright内的/* upper / \ left right \ / lower */ a.upper::base = 1; 指定名称空间,但您不能为该父母的直接“第三轮”指定名称空间。就像你试图这样做一样:

/*       upper
        /  |  \
   left center right
        \  |  /
         lower
*/

在这种情况下,您可以使其工作,但这种架构方法是值得怀疑的。因为它提出了一个问题,如果你真的迫切需要组件 - 实体模式。

{
  "name": "login-ts-react",
  "version": "1.0.0",
  "main": "webpack.config.js",
  "scripts": {
    "start": "webpack-dev-server"
  },
  "repository": "https://github.com/abhsrivastava/login-ts-react.git",
  "author": "Abhishek Srivastava <abhsrivastava@foo>",
  "license": "MIT",
  "dependencies": {
    "react": "^16.3.2",
    "react-bootstrap": "^0.32.1",
    "react-dom": "^16.3.2"
  },
  "devDependencies": {
    "@types/react": "^16.3.13",
    "@types/react-bootstrap": "^0.32.9",
    "@types/react-dom": "^16.0.5",
    "awesome-typescript-loader": "^5.0.0",
    "css-loader": "^0.28.11",
    "html-webpack-plugin": "^3.2.0",
    "import-glob-loader": "^1.1.0",
    "mini-css-extract-plugin": "^0.4.0",
    "node-sass": "^4.9.0",
    "sass-loader": "^7.0.1",
    "source-map-loader": "^0.2.3",
    "style-loader": "^0.21.0",
    "typescript": "^2.8.3",
    "webpack": "^4.6.0",
    "webpack-cli": "^2.0.15",
    "webpack-dev-server": "^3.1.3"
  }
}

换句话说:虽然为了祖父母能够接触到它的孙子而让两个以上的父母处于关系中是有意思的,但在实践中,使用质粒的细菌已经找到了更好的方法。