LINUX.ORG.RU

1. Да, если объявить функцию с атрибутом friend

2. Функция не экспортируется за пределы файла, где она определена, держится специальное поле в vtable

annoynimous ★★★★★
()

Странного хочешь ты, тёмная сторона завладевает душой твоей.

Ты бы хоть сказал, а нафига оно тебе надо.

Dark_SavanT ★★★★★
()

>Если нельзя то чем конкретно это контролируется как операционная система узнаёт что отсюда туда нельзя?

Операционная система срать хотела на C++, его квалификаторы доступа и прочую его муру.

Love5an
()

Операционная система ничего не знает ни про ООП, ни про С++, ни, тем более, о твоем классе.
Зато про все эти чудесные вещи очень хорошо осведомлен компилятор. Вот он то и не позволяет вызывать метдо, помеченный как private в коде, внешнем по отношению к классу.
Как-то так.

P.S. Если очень захотеть и поупражнятся в ассемблере, тогда вполне себе можно вызвать приватный метод извне класса. Только вот оно тебе надо?

trex6 ★★★★★
()

>Можно ли передать управление приватному методу экземпляру класса из вне?

Можно, либо define private public, либо отнаследоваться от того класса, и написать публичный метод-обёртку над данным

Если нельзя то чем конкретно это контролируется как операционная система узнаёт что отсюда туда нельзя?

Контролируется компилятором

yoghurt ★★★★★
()
Ответ на: комментарий от yoghurt

ибо отнаследоваться от того класса, и написать публичный метод-обёртку над данным


С каких пор private методы родителей можно вызывать в наследниках?

anonymous
()

что можно вызывать а что нельзя решает компилятор во время компиляции, после компиляции приватный метод может даже не существовать - заинлайнится, но если выключить оптимизацию и предотвратить inline, то теоретически ничто не мешает загрузить бинарник другим бинарником и передать управление на приватную функцию по некоему адресу.
вообщем все это извращение. в конце концов и в чужих сырцах никто не мешает править private на public, особенно если хочеться писать анекдоты на c++.

xtron
()

в VC++ так можно

class v{int i;void s(int){}};
int main(){
    v o;
    __asm{ 
        lea ecx, [o];
        push dword ptr[ecx];
        call v::s;
    }
}

osox
()
Ответ на: комментарий от xtron

> что можно вызывать а что нельзя решает компилятор во время

компиляции, после компиляции приватный метод может даже не

существовать - заинлайнится



Интересно, а как компилятор соображает, что из какого-либо публичного метода можно вернуть указатель на закрытый? Программа упадёт?

archimag ★★★
()

Спасибо вам господа, за ответы!!!

Теперь сложнее - как передать управление приватному методу, экземпляра объекта в JAVA?

andreykyz ★★
() автор топика
Ответ на: комментарий от andreykyz

>JAVA
я джва года ждал чтобы так кто-нибудь написал

Love5an
()
Ответ на: комментарий от archimag

программа не упадет, т.к. от инлайна нельзя брать указатели; но вот инфа о приватном молча утекает из-за неполной спецификации типа

#include <iostream>

class C
{
public:
    void (C::*function)();
    C() {
        function=&C::f;
        function=&C::g;
    }
    void f() { std::cout << "f\n"; }
private:
    void g() { std::cout << "g\n"; }
};

int main()
{
    C c;
    (c.*(c.function))();
    return 0;
}
www_linux_org_ru ★★★★★
()
Ответ на: комментарий от Slader

>Рефлексия вам поможет

Для этого секьюрити-контекст нужен корневой. В контексте, например, апплета это не прокатит.

Absurd ★★★
()
Ответ на: комментарий от andreykyz

Лучше поразмышляйте на тему, как можно выкопать общественный бассейн ложкой.

trex6 ★★★★★
()
Ответ на: комментарий от Reset

> Перед включение заголовка сказать #define private public

Можно рискнуть, но не всегда сработает и можно сломать кое-что другое.

const86 ★★★★★
()
Ответ на: комментарий от vvviperrr

> ясно же, что это стеб

Уж не знаю, с каким намерением было написано, но на практике ещё и не такие методы применяются ;)

const86 ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.