【问题标题】:C++: Inheriting two base classes with same name, different namespaceC ++:继承两个具有相同名称,不同命名空间的基类
【发布时间】:2011-05-29 16:33:02
【问题描述】:

是否可以继承两个具有相同名称的基类,如果它们位于不同的命名空间中?

顺便说一句,我目前不打算这样做,但我很好奇:

class SuperShape : Physics::Shape, Graphics::Shape
{
    // constructor
    SuperShape( int x, int y, float color) : ???( x, y ), ???( color );
}

【问题讨论】:

  • 顺便说一句,您忘记在继承中提及“公共”“受保护”或“私有”。
  • @soulSurfer2010:没有必要指明publicprotectedprivate。在这种情况下,它默认为private,因为它是class。对于struct,它默认为public。就个人而言,我总是明确声明访问修饰符,但 OP 的代码在指示基类方面是有效的 C++。
  • 回复:“如果两个基类位于不同的命名空间中,是否可以继承两个具有相同名称的基类?”答案是肯定的,因为他们确实有不同的名字
  • @JohnDibling 是的,这在下面@GregHewgill 的回答中有解释。
  • 事实上所有的答案,但格雷格的措辞最清楚

标签: c++ inheritance namespaces constructor multiple-inheritance


【解决方案1】:

Physics::Shape & Graphics::Shape 分别是什么?

【讨论】:

    【解决方案2】:

    不同命名空间中的类实际上 确实 有不同的名称(就 C++ 而言),即使名称的最后一部分(在您的示例中为 Shape)可能相同。对完全限定名称执行名称解析,包括所有命名空间。

    【讨论】:

      【解决方案3】:

      嗯,简单地说:

      SuperShape( int x, int y, float color)
          : Physics::Shape( x, y ), Graphics::Shape( color )
      {
      }
      

      【讨论】:

        【解决方案4】:

        是的。构造函数的 mem-initializers 必须使用限定名。

        SuperShape::SuperShape( int x, int y, float color )
            : Physics::Shape( x, y ), Graphics::Shape( color )
        { /*...*/ }
        

        【讨论】:

          【解决方案5】:

          当然,为什么不呢?没有什么能阻止你这样做。这是一个工作示例:

          #include <iostream>
          #include <typeinfo>
          #include <string>
          
          namespace NS1 {
          
          class MyClass {
          public:
              MyClass (const std::string &) {}
          };
          
          }
          
          namespace NS2 {
          
          class MyClass {
          public:
              MyClass (int) {}
          };
          
          }
          
          class MyClass :
              public NS1::MyClass,
              public NS2::MyClass
          {
          public:
              MyClass () :
                  NS1::MyClass (std::string ("Hello")),
                  NS2::MyClass (1986)
              {}
          };
          
          int main ()
          {
              MyClass clazz;
              std::cout << typeid (NS1::MyClass).name () << std::endl;
              std::cout << typeid (NS2::MyClass).name () << std::endl;
              std::cout << typeid (clazz).name () << std::endl;
          }
          

          【讨论】:

          • 几乎都是很好的答案,但这个是最彻底的。谢谢大家!
          • 这种情况下如何执行using contructor语法?
          【解决方案6】:

          没有人提到这是命名空间存在的唯一原因。 :)

          【讨论】:

          • 这不是命名空间存在的唯一原因。
          猜你喜欢
          • 2015-07-18
          • 2014-01-12
          • 2010-11-12
          • 1970-01-01
          • 2013-04-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多