2010-09-18 3 views
2
struct A { 
protected: 
    int y; 
public: 
    int z; 
}; 

struct F : A { 
public: 
    using A::y; 
private: 
    using A::z; 
}; 

int main() { 
    F obj_F; 
    obj_F.y = 9; 
    obj_F.z = 10; 
} 

Источник: http://publib.boulder.ibm.com/infocenter/comphelp/v7v91/index.jsp?topic=/com.ibm.vacpp7a.doc/language/ref/clrc14cplr135.htmдоступ членов в иерархии наследования - C++

В приведенном выше коде obj_F.z = 10; - разрешено. Объяснение: Доступ к члену z остается открытым. Объявление частного использования с использованием A :: z не влияет на доступ z.

Может ли кто-нибудь сказать мне, если z, объявленный как закрытый, доступен снаружи, то в чем смысл этого частного? Что оно делает?

Благодаря

-Saiyasodharan

+1

Ошибка C2248: 'F :: z': не может получить доступ к закрытому члену, объявленному в классе 'F' – bjskishore123

+1

В g ++: * ошибка: 'int A :: z' недоступен * –

+0

получил ту же ошибку в VC++ 10 .. хотя он правильный в соответствии со стандартами, он неверен в MS VC++, кажется – saiy2k

ответ

3

Код действителен в соответствии со стандартом - см это стандартное правило, которое я не имел в виду, когда я ответил, прежде чем

A member m is accessible when named in class N if

  • [...], or
  • there exists a base class B of N that is accessible at the point of reference, and m is accessible when named in class B.

Это полностью относится к коду, и, таким образом, доступ является valid ... Похоже, основная цель этого правила заключается в том, чтобы позволить объявлениям друзей базы применяться к унаследованным членам, но это также относится к этому случаю.


(Игнорируйте части этого, что говорит, что код недействителен - Это действует, как описано выше, эта часть является старой версией моего ответа, продолжал здесь, чтобы служить в качестве справочной информации.)

Нет, этот код недействителен. Вот почему эквивалентная «доступ-декларация» называется таким образом (они являются устаревшими, хотя)

struct F : A { 
public: 
    A::y; 
private: 
    A::z; 
}; 

Они называются «доступ-декларация» именно потому, что они могут изменить доступ ...В вашем примере класс именования - F, а z в качестве члена F является приватным, потому что с использованием декларации сделал, изменив уровень доступа с именем z.

+1

Мое сомнение cleard .. thx :-) – saiy2k

+0

Я не знаю, почему Чарльз удалил свой ответ (хотя первый и последний параграфы его ответа были правильными). 'Код действителен в соответствии со стандартом'. Что делает код действительным? Он все еще плохо сформирован. Это отличается от действительности кода? –

+0

@Правовый код действителен - см. Текст, который я цитировал из Стандарта. Я просто тестировал различные компиляторы, чтобы понять, как они соответствуют этой странности, и для меня это только принимает. Я отправил PR, чтобы поговорить: http://llvm.org/bugs/show_bug.cgi?id=8178. @Charles также сделал хороший момент обмануть его, сказав «obj_F.A :: z». –

-2

F наследует Частной. Таким образом, вы не можете получить доступ к публичным членам A, если вы используете определение F вне F. Поскольку F не определяет членов, F в принципе бесполезен.

Если F наследует публично (т.е. :)

struct F : public A {}; 

Затем вы можете использовать общественный элемент в. так что вы можете написать obj_F.z

Если у вас есть переменный г, что является общественным в и частные в F, то есть:

struct A { public: int z; }; 
struct F : public A { private: int z; }; 

тогда два г фактически являются две разными переменными. Это не то, что вы хотите.

также, как сказал Андре Хольцнер, ваше использование заявления бесполезно здесь.

Как правило, вы не можете на каком-либо объектном языке программирования ограничивать сферу действия члена в общепринятом подклассе. Либо определение класса не будет компилироваться, не будет подчиняться, либо создаст другого члена с тем же именем. Это потому, что ваш F несовместим с кодом, который имеет дело с A или подклассом.

+1

'F наследует конфиденциальность'. -1 для этого. 'F' и' A' являются структурами (а не классами). –

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