Как я могу вернуть объект, на который указывает указатель абстрактного класса? - PullRequest
1 голос
/ 11 июля 2020

Итак, чтобы подвести итог, у меня есть что-то эквивалентное

class A{
public:
    virtual void foo() const = 0;
};

class B : public A{
public:
    B(){};
    void foo() const override{
        //some code
    };
};

class C{
public:
    C(){};
    B someFunction();
private:
    A* x;
};

и A* x; указывает на какой-то B объект, и мне нужно someFuntion(), чтобы вернуть тот объект, на который указывает x. Я пробовал просто сделать return *x, но это не сработало.

Ответы [ 2 ]

2 голосов
/ 11 июля 2020

Вы должны преобразовать x в B перед отменой ссылки.

class C
{
public:
   C() {};
   B someFunction()
   {
      return *static_cast<B*>(x); // like this
   }
private:
   A* x = new B;
};

Вам также необходимо предоставить virtual ~A(), чтобы не было неопределенного поведения. Когда использовать виртуальные деструкторы?

class A 
{
public:
   virtual void foo() const = 0;
   virtual ~A() = default;
};
1 голос
/ 11 июля 2020

Если вы знаете, что x указывает на объект B, сначала примените его.

return *static_cast<B*>(x);
...