繁体   English   中英

Inheritance 用于 class 具有相同名称但不同命名空间 c++

[英]Inheritance for class with the same name but different namespace c++

是否可以从具有相同名称但在不同命名空间中的 class 继承以及如何实现?

例如我有以下结构:

   namespace general {
           namespace gui {
             struct GUI {

        };
   }}

我可不可以做:

 namespace proxy {
          namespace gui {
            struct GUI : general::gui::GUI {
    
          };
     }}

或者/应该有另一种方法来做到这一点(实际上命名 class / 结构不同)?

根据Pete 的 Becker评论进行更新。

它的当前结构方式是这样的:

gui.h

    #include "world.h"
     
namespace general {
               namespace gui {
                 struct GUI {
    
            };
   }}

世界.h

namespace general {

    namespace world {

        struct World {};
}}

代理.h

 namespace proxy {
          namespace gui {
            struct GUI : general::gui::GUI {

          };
     }}

我的理解是编译器查看 world.h,没有找到 general::gui 并抱怨

proxy.h(17,30): error C2039: 'gui': is not a member of 'general'
world.h(4): message : see declaration of 'general'

如果我添加

namespace world {
    
            struct World {};
    }}

对于gui.h或其他方式,它很可能会起作用。 只是对我为什么需要这样做感到困惑。

更新 2(带有 .cpp 文件):

世界.cpp

#include "world.h"

namespace general {
    namespace world {
                    World{

gui.cpp

#include "gui.h"

namespace general {
    namespace gui {

代理.cpp

#include "proxy.h"

namespace proxy {
    namespace gui {

在 .cpp 文件方面,所有这些都只是包括其相应的 header 文件。 这是一般规则。

加上这里是(相关的)header 文件链,最肯定的问题出在哪里:

goal.h    includes      world.h and proxy.h
gui.h     includes      world.h and goal.h
menu.h    includes      goal.h
world.h - includes nothing
proxy.h - includes nothing

是的,这是可能的。 如果您遇到错误,则说明您的代码中有一些您没有在此处发布的内容,例如 using namespace 语句。

proxy::gui::GUIgeneral::gui::GUI是两个完全不同的类。 两者都以GUI结尾的事实根本说明不了什么。

class 的全名/全名始终是全名,包括命名空间。

这就是命名空间的意义所在。 它们的发明是为了防止不同库之间的名称冲突。 假设您有供应商“A”库,其中包括 class GUI 想象一下,您想在自己的代码中使用这个库,您还定义了一个 class GUI 如果没有命名空间,这些名称会发生冲突,您将被迫重命名自己的 class 以使用该库。

但是有了命名空间,一切都很好。 A::GUIyourcode::GUI或普通GUI不同。

所以

namespace general { namespace gui {
   class GUI {};
}}

namespace proxy { namespace gui {
   class GUI:public general::gui::GUI {};
}}

将/应该工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM