У меня есть абстрактный базовый класс с некоторыми атрибутами или элементами-членами и некоторыми открытыми функциями и открытыми виртуальными функциями.В производном классе абстрактного класса я хочу (а) получить доступ к членам абстрактного базового класса как к закрытым членам и (б) публичные функции и определенные чисто виртуальные функции остаются открытыми.Есть ли способ сделать это?То есть, что должно быть 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 - закрытым, функции в производном становятся закрытыми.