upublicznianie funkcji

0

Jak w klasie pochodnej zrobić tak, aby dziedziczona funkcja protected była publiczna ?
W BCB wystarczy powtórzyć nagłówek funkcji, a czy standartowe c++ oferuje takie mechanizmy?
Najlepsze co wymyśliłem do tej pory to zrobienie funkcji inline tzn.

class a
{
protected:
   double funkcja(int i) { return i; };
};

class b: public a
{
public:
   inline double funkcja(int i) { return a::funkcja(i); };
};
0

Nie da rady... Nie można "upublicznić" czegoś co wcześniej nie było publiczne.

0

tworzysz publiczny wskaznik do chronionej funkcji i ustawiasz go w konstruktorze.

#include <stdio.h>

class a{
  public:
    a();
    void* (*fun)(int);

  protected:
    static void* f(int c);
};

a::a(){
  fun=f;
}

void* a::f(int c){
  printf("%d\n",c);
  return (void*)0x12345678;
}

main(){
  a o;
  printf("%p\n",o.fun(-123));
  return 0;
}

nie wiem tylko jak pominac static ...

error: ISO C++ forbids taking the address of an unqualified non-static member function to form a pointer to member function.

0

W sumie sporo zalezy od tego co chcesz osiagnac, bo jesli funkcje nie sa wirtualne to zawsze mozesz przeslonic( wirtualne tez mozesz przeslonic zapewne ale tego nigdy nie probowale )
Na przyklad tak:

class A
{
        protected:
            void fun (int i)
            {
                cout << i;
            };
};

class B: public A
{
  public:
    void fun( int i)
    {
            A::fun(i);
    };
};

int main()
{
	B ob;
	ob.fun( 24 );
	return 0;
}

Pozdrawiam

0

Chodzi mi o to, aby klasa B (pochodna klasy A) miała publiczną metode, która wywoła dziedziczoną metode klasy A (protected). Metody te mają posiadać takie same nazwy oraz pobierać te same parametry i zwracać ten sam wynik. Chce to osiągnąć najmniejszym kosztem, a najlepiej zerowym.
Pewnie, że moge w klasie B storzyć nową funkcje, która składa sie tylko z jednej instrukcji - wywołania tej żądanej funkcji klasy A (chronionej) z podanymi parametrami.
Ale wiąże sie to z kosztami. Zamiast jeden raz trzeba 2 razy wrzucić parametry na stos. Jeśli wśród nich znajdą sie obiekty przekazywane nie przez referencje, to 2x będą wykonywane ich kopie !). Również 2x będzię wykonany call i ret.
Tak więc szukam sposobu, aby tych kosztów sie pozbyć. Czy zastosowanie inline (tak jak w moim pierwszym poście) wyeliminuje je ?

0

Zauważ że funkcję w swoim pierwszym poście masz zdefiniowaną w ciele kalsy, więc z założenia jest inline. Jeśli będzie poza ciałem to także funkcję w klasie a zrób inline. Słowo to to tylko podpowiedź dla kompilatora, jeśli ją uwzględni to faktycznie zaoszczędzisz na czasie, jeśli nie to tak jakbyś wywoływał dwie funkcje.

0

Ja napisze tak: slowo kluczowe protected jet po to po co jest ;) jesli to Ty projektujesz klasy to chyba wiesz co robisz i jak bedziesz tego uzywal. Co do "marnowania" czasu/pamieci przez kolejne wywolanie to ja bym sie nie przejmowal i tak kompilator zrobi jak "uwaza".

1 użytkowników online, w tym zalogowanych: 0, gości: 1