2013-10-14 3 views
1

У меня есть производный класс (класс B) из базового класса (класс A). Класс A имеет защищенную виртуальную функцию foo(), которую я хочу переопределить и использовать в качестве частного в производном классе.C++ производный класс с спецификатором частного доступа

Class A{ 
    protected: 
    virtual void foo() = 0; 
} 

Я интересно следующее

Class B: public Class A 
    private: 
    virtual void foo(); 

и

Class B: private Class A 
    private: 
    virtual void foo(); 

ли то же самое.

+0

Зачем вам это нужно? – molbdnilo

ответ

1

Это не то же самое. В первом примере Bis-a - A, а во втором - нет. Таким образом, в первом случае вы можете иметь код, такой как

void foo(const A& a); 

, который принимает A и B в качестве аргументов. С частным наследством вы не могли этого сделать. Например,

A a; 
B b; 
foo(a); // OK with private and public inheritance 
foo(b); // OK only with public inheritance, i.e. B is an A. 
+0

Я думаю, что во втором случае 'B' is-an-'A тоже, хотя вы не можете адресовать объект' B' ссылкой (или указателем) A. – deepmax

+0

@MM. Я бы сказал, что это * has-a-A *, но я понимаю, что в этом нет единого мнения. – juanchopanza

+0

@juanchopanza Можете ли вы привести пример и знаете ли вы какое-либо место, которое объясняет это более подробно? Я не понял это полностью. –

0

Нет, ваши два случая не совпадают.

Во втором случае class B не может быть отправлен в class A, поскольку скрытый базовый класс скрыт. в этом аспекте было бы такое же поведение, как если бы class A был бы членом class B. не

0

Нет и не так же В классе открытого наследования обув элементы а() будет защищен член в классе B В частном классе наследования B может получить доступ только открытые членов класса А, так что не будет представлять никакого Foo() класса A в классе B.

 Смежные вопросы

  • Нет связанных вопросов^_^