命名空间继承

Namespace inheritance

本文关键字:继承 命名空间      更新时间:2023-10-16

首先我不明白为什么我会得到这个错误

error: ‘cout’ was not declared in this scope

对于以下代码

#include <iostream>
namespace a {
    void print() {
            std:cout << "a" << std::endl;
    }           
}       
namespace b {
    using namespace a;
    void print() {
            std:cout << "b" << std::endl;
    }           
}
int main() {
    b::print();
} 

从广义上讲,我正在研究名称空间中的继承行为,因为我不需要类本身(它们无论如何都只是singleton)。对于名称空间方法,有什么建议或问题需要注意吗?


编辑:好吧,我;I’我对打字错误感到抱歉。在这种情况下,我可以把问题扩大吗?

#include <iostream>
namespace a {

    void print2() {
            print();
    }
    void print() {
            std::cout << "a" << std::endl;
    }           
}       
namespace b {
    using namespace a;
    void print() {
            std::cout << "b" << std::endl;
    }           
}
int main() {
    b::print2();
}     

这不会编译错误:未在此作用域中声明"print"

有没有一种方法可以以通用的方式模拟类继承?

例如,如果a和b是类,则会打印a。如果print被声明为虚拟,那么b将被打印。

这可能吗?或者命名空间"继承"只是一个廉价的破解?


编辑2:

在print2输出a之前声明print。我想我现在的问题是:在这种情况下,有没有办法或模仿虚拟关键字?因此,下面将分别打印b和c。

#include <iostream>
namespace a {
    void print() {
            std::cout << "a" << std::endl;
    }
    void print2() {
            print();
    }
}       
namespace b {
    using namespace a;
    void print() {
            std::cout << "b" << std::endl;
    }
}
namespace c {
    using namespace a;
    void print() {
            std::cout << "c" << std::endl;
    }
 }
int main() {
    b::print2();
    c::print2();
}      

您拼写错了std::coutstd:cout)。

在您的代码中,std:goto声明了一个标签。声明的其余部分是:

cout << "a" << std::endl; 

因此,编译器抱怨未知标识符cout

更新:

修复拼写错误后,将功能顺序更改为:

void print() {
        std::cout << "a" << std::endl;
}           
void print2() {
        print();
}

更新2:

在你再次编辑这个问题后,它完全失去了最初的意义。但答案是No。否,不能继承命名空间。