Как указывалось в ответах, я совершил глупую ошибку, которая не имеет ничего общего с полиморфизмом или умным указателем. Исправленная версия находится в принятом ответе.
============== Исходный вопрос ============= =====
Я пытаюсь заставить умный указатель работать с полиморфизмом. В следующем коде прототипа реализация чистой virtual
функции Base::print()
должна находиться в блоке памяти объекта Derived
. DerivedWrap
имеют доступ к указателю на объект Derived
.
Почему DerivedWrap::print()
не может получить доступ к реализации функции?
using namespace std;
class Base
{
public:
virtual void print() = 0;
};
class Derived : public Base
{
public:
Derived(int in) : i(in) {}
void print() {
cout << "int is " << i << endl;
}
private:
int i;
};
class DerivedWrap
{
public:
DerivedWrap() : DerivedWrap(make_unique<Derived>(2)) {}
DerivedWrap(unique_ptr<Base> pBase) : _pBase(move(pBase)) {}
void print()
{
_pBase->print();
}
private:
unique_ptr<Base> _pBase;
};
int main()
{
DerivedWrap pDW1();
pDW1->print(); // error: request for member ‘print’ in ‘pDW1’, which is of non-class type ‘DerivedWrap()’
DerivedWrap pDW2(make_unique<Derived>(2));
pDW2->print(); // error: base operand of ‘->’ has non-pointer type ‘DerivedWrap’
return 0;
}