首页 > 解决方案 > C++中的嵌套类、继承和共享指针

问题描述

显然,下面的程序在返回表达式中失败了:

#include <memory>

class Base {
    public:

        class Nested {
            public:
                int c;
        };
};

class A : public Base {
    public:

        class Nested : public Base::Nested {
            public:
                int c = 1;
        };
};

class B : public Base {
    public:

        class Nested : public Base::Nested {
            public:
                int c = 2;
        };
};

int main() {
    std::shared_ptr<Base> X = std::make_shared<A>();

    return X::Nested.c;
};

如何获得X 的Nested.c值?

换句话说,我有一个基类(Base)和两个派生类(AB)。每个派生类都有一个嵌套类(Nested)。我想从实例X调用Nested.c ,该实例被动态选择为派生类之一。

标签: c++c++11inheritancenestedshared-ptr

解决方案


可能只是对嵌套类的误解。嵌套类不会神奇地将成员添加到它的父类。您需要手动执行此操作,例如:

class Base {
  public:

    class Nested {
        public:
            int c;
    };

    Nested nested; // member of nested class Base::Nested.
};

请记住Base::NestedA::NestedB::Nested都是不同的类。尽管它们看起来很相似,但它们根本没有关系。


也许以下是您想要的:

#include <memory>

class Base {
private:
    class Nested {
        public:
            int c;
    };

    Nested nested; // member of nested class Base::Nested.
 public:
  virtual int getC() const { return this->nested.c; }
};

class A : public Base {
private:
    class Nested {
        public:
            int c = 1;
    };

    Nested nested; // member of nested class A::Nested.
 public:
  int getC() const override { return this->nested.c; }
};

class B : public Base {
private:
    class Nested {
        public:
            int c = 2;
    };

    Nested nested; // member of nested class B::Nested.
 public:
  int getC() const override { return this->nested.c; }
};

int main() {
    std::shared_ptr<Base> X = std::make_shared<B>();
    return (*X).getC();
};

每个类都有它自己的嵌套类的成员,并返回c一个虚拟的 getter。


推荐阅读