Защищенный производный класс - PullRequest
5 голосов
/ 12 января 2009
 #include <iostream>
using namespace std;

class Base
{
    public:
        Base(){cout <<"Base"<<endl;}
        virtual ~Base(){cout<<"~Base"<<endl;}
        virtual void foo(){ cout<<"foo base"<<endl;}
};

class Derived: private Base
{
    public:
        Derived(){cout<<"Derived"<<endl;}
        virtual ~Derived(){cout<<"~Derived"<<endl;}
        virtual void  foo(){ cout<<"foo dervied"<<endl;}
};


int main(int argc, char *argv[])
{
    Base *pb = new Derived;
    Derived d;
    d.foo();
    return 0;
}

при выполнении вышеупомянутой программы-примера я получаю следующую ошибку: protected.cpp: В функции «int main (int, char **)»: protected.cpp: 26: ошибка: «База» - недоступная база «Производная»

Почему невозможно создать производный объект с базовым указателем ????


Так что я могу создать экземпляр класса Derived, например

Derived d
Derived d1= new Derived;

Но создание экземпляра из указателя базового класса, например

Base * b = new derived 

потерпит неудачу.

Это потому, что Derived на самом деле не является производным классом от Base, если он является производным и закрытым.

Это правильно ?????

Ответы [ 3 ]

6 голосов
/ 12 января 2009

Почему невозможно создать производный объект с базовым указателем ????

Потому что база private. Это явно запрещает рассматривать ваш класс как Base экземпляр извне. Если смотреть снаружи, ваш класс Derived является , а не подклассом Base, только изнутри самого класса.

То же самое относится к наследованию protected, с той лишь разницей, что базовый класс теперь больше не является частным для собственного класса, а скорее для любого производного класса. Хотя снаружи он ведет себя так же, как частное наследство.

4 голосов
/ 12 января 2009

Возможно, вы захотите взглянуть на этот faq на c ++ и наследование. В частности, секции 24,5 и 24,6 .

0 голосов
/ 12 января 2009

Так что я могу создать экземпляр класса Derived вроде

Производное d Производное d1 = новое Производное; Но создание экземпляра из базового класса указатель типа

База * b = новый производный потерпит неудачу.

Это потому что Derived не на самом деле производный класс от Base когда выведено под стражу и в частном порядке ??

Это правильно ?????

Это точно, как объяснил Конрад.

Это на самом деле все еще происходит от базы. Чтобы убедиться в этом, если вы не переопределите виртуальные методы в Derived, будут вызваны базовые версии.

Однако, поскольку вы объявили Base защищенной, компилятор не позволит автоматически приводить Derived * к Base *, поскольку суперкласс Base не виден снаружи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...