嵌套类,interitance,名称冲突

时间:2015-09-03 09:42:21

标签: c++ inheritance nested

我想创建一个用于读取树形式的配置的接口,如JSON或XML。为此,我考虑了以下界面:

class ConfigLoader
{
protected:

    class Node
    {
    public:

        virtual ~Node() { }

        virtual int GetAsInt( const Utf8String & name ) const = 0;

        virtual int GetAsInt( const Utf8String & name, int def ) const = 0;

        virtual bool GetAsBool( const Utf8String & name ) const = 0;

        virtual bool GetAsBool( const Utf8String & name, bool def ) const = 0;

        virtual const Node & GetChild( const Utf8String & name ) const = 0;

        // Etc
    };

public:

    virtual ~ConfigLoader() { }

    virtual void Load( const core::Utf8String & sText ) = 0;
};

然后我实现读取不同的格式类型(JSON,XML等):

class ConfigLoaderJSON : public ConfigLoader
{
protected:

    class Node : public ConfigLoader::Node
    {
    public:

        virtual ~Node() { }

        virtual int GetAsInt( const Utf8String & name ) const;

        virtual int GetAsInt( const Utf8String & name, int def ) const;

        virtual bool GetAsBool( const Utf8String & name ) const;

        virtual bool GetAsBool( const Utf8String & name, bool def ) const;

        virtual const Node & GetChild( const Utf8String & name ) const;
    };

protected:

    Json::Reader m_oReader;

    JSon::Value m_oRoot;

public:

    virtual void Load( const Utf8String & sText );
};

我的问题是:我是否可以创建一个与父类的嵌套类同名的嵌套类? Aren的ConfigLoaderJSON :: Node和ConfigLoader :: Node由于ConfigLoader :: Node受到保护而不是私有而会发生冲突吗?

谢谢!

1 个答案:

答案 0 :(得分:2)

  

我可以创建一个与其中一个名称相同的嵌套类   父类的嵌套类

是的,您是被允许的,但派生类中定义的嵌套类将使基本嵌套类隐藏,就像在父类和子类中定义的成员变量一样。

  

ConfigLoaderJSON :: Node和ConfigLoader :: Node不在   由于ConfigLoader :: Node受保护而非私有

导致冲突

不,它们不会发生冲突,因为您将使用范围解析运算符来访问它们(ConfigLoader :: Node for ConfigLoader的Node,ConfigLoaderJSON :: Node for ConfigLoaderJSON的Node)。 不要使嵌套类成为私有(在这种情况下。因为它不能在派生类实例中访问)