Вложенные классы, наследование и общие указатели в C ++ - PullRequest
0 голосов
/ 16 января 2020

Сбой программы ниже, очевидно, в выражении return :

#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;
};

Как я могу получить Nested. c значение X?

Другими словами, у меня есть один базовый класс ( Base ) и два производных класса ( A и B ). Каждый производный класс имеет вложенный класс ( Nested ). Я хочу вызвать Nested. c из экземпляра X , который динамически выбирается как один из производных классов.

1 Ответ

0 голосов
/ 16 января 2020

Вероятно, просто неправильное представление о вложенных классах. Вложенный класс не волшебным образом добавляет членов в родительский класс. Это необходимо сделать вручную, например:

class Base {
  public:

    class Nested {
        public:
            int c;
    };

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

Имейте в виду, что Base::Nested, A::Nested и B::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 с виртуальным геттером.

...