Можно ли использовать конструктор копирования в классе Derived без использования конструктора базовой копии? - PullRequest
0 голосов
/ 04 марта 2019

Я новичок в C ++, и то, что я узнал до сих пор, - это когда мы вызываем конструктор копирования из класса Derived, вызывается конструктор копирования класса Base.Допустим, у меня есть конструктор копирования в приватной области базового класса.Как я могу вызвать конструктор копирования класса Derived, не вызывая конструктор копирования класса Base?(В этом коде A нет реализации конструктора копирования, и это то, что я хотел бы знать).

class NonCopyable
{
protected:
NonCopyable(){}
~NonCopyable(){}
private:
NonCopyable(const NonCopyable& nonCopyable);
NonCopyable& operator=(const NonCopyable& nonCopyable);
};
class A: public NonCopyable
{
};

Ответы [ 2 ]

0 голосов
/ 06 марта 2019

Простой ответ: да, это возможно.

Вам нужно только определить выделенный конструктор производной копии, который не вызывает NonCopyable конструктор копирования (конечно, это может сбивать с толку в реальном программном приложении, но этодругая проблема):

Этот класс конструируем, но не копируемо:

class CannotBeCopied: public NonCopyable {};

Этот класс конструируем и также копируемо:

class CanBeCopied: public NonCopyable {
public: 
    CanBeCopied() = default; // needed since otherwise CopyConstructor is only known construtor
    CanBeCopied(const CanBeCopied& b) { } // calls NonCopyable::NonCopyable() default-constructor, which is just protected
};

Смотрите пример жизни здесь: http://coliru.stacked -crooked.com / a / 60c9fc42fa2dd59a

0 голосов
/ 06 марта 2019

После некоторых поисков я нашел способ.Существует способ вызвать конструктор копирования класса Derived, не вызывая конструктор копирования класса Base.Все, что нам нужно сделать, это построить конструктор копирования в A, и A наследуют конструктор NonCopyable, в то время как конструктор копирования является приватным:

class NonCopyable
{
protected:
    NonCopyable(){}
    ~NonCopyable(){}
private:
    NonCopyable(const NonCopyable& nonCopyable);
    NonCopyable& operator=(const NonCopyable& nonCopyable);
};
class A: public NonCopyable
{
public:
    A(){}
    A(const A& other){}
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...