Виртуальная функция наследования абстрактного класса C ++ - PullRequest
0 голосов
/ 30 ноября 2018

У меня есть абстрактный базовый класс с некоторыми атрибутами или элементами-членами и некоторыми открытыми функциями и открытыми виртуальными функциями.В производном классе абстрактного класса я хочу (а) получить доступ к членам абстрактного базового класса как к закрытым членам и (б) публичные функции и определенные чисто виртуальные функции остаются открытыми.Есть ли способ сделать это?То есть, что должно быть xxxx AbstractBase и yyyy-спецификатор доступа в производном, чтобы реализовать это?

#include <iostream>

class AbstractBase {
 xxxx: <-- // protected/private/public?
  std::string baseprivate1;

 public:
  virtual void set_privates() = 0;
  void print() { std::cout << baseprivate1 << std::endl; }
  void foo() { // some definition here }
};

class Derived : yyyy AbstractBase {  <--- //public/protected/private? 
 private:
  std::string derivedprivate1;

 public:
  void set_privates() {
    // I want this baseprivate1 to be private in derived class as well.
    // When I choose xxxx as protected and yyyy as public, the baseprivate1 is protected. 
    this->baseprivate1 = "Base private1";
    this->derivedprivate1 = "Derived private1";
  }
  void print() {
    AbstractBase::print();
    std::cout << this->derivedprivate1;
  }
  // When I choose xxxx as protected and yyyy as protected
  // foo becomes protected and unable to call from outside
  // I want the foo of abstract base to be public here as well. 
};

int main(int argc, char *argv[]){
    Derived d;
    d.set_privates();
    d.print();
    d.foo(); // I should be able to call foo of abstract base class
}

Это может быть перепутано как дубликат Разница между частным, общедоступным и защищенным наследованием.Если вы сохраните xxxx защищенным, а yyyy - открытым, то baseprivate1 будет защищен в Derived и больше не будет закрытым.В качестве альтернативы, если xxxx является открытым / защищенным, а yyyy - закрытым, функции в производном становятся закрытыми.

1 Ответ

0 голосов
/ 12 декабря 2018

Один из способов добиться того, что вы хотите, - это использовать частное наследование AbstractBase в вашем производном классе.Затем вы можете предоставить некоторые методы AbstractBase с помощью декларации использования в открытом спецификаторе доступа в классе Derived.

#include <iostream>

class AbstractBase {
    public:
        std::string baseprivate1;

        virtual void set_privates() = 0;
        void print() { std::cout << baseprivate1 << std::endl; }
        void foo() { /* some definition here */ }
};

class Derived : private AbstractBase { // use private inheritance on AbstractBase
    private:
        std::string derivedprivate1;

    public:
        // expose AbstractBase's methods with using-declarations
        using AbstractBase::foo;
        using AbstractBase::print;

        void set_privates() {
            this->baseprivate1 = "Base private1";
            this->derivedprivate1 = "Derived private1";
        }

        void print() {
            AbstractBase::print();
            std::cout << this->derivedprivate1 << std::endl;;
        }
};

int main(int argc, char *argv[]){
    Derived d;
    d.set_privates();
    d.print();
    d.foo();
    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...