Inheritance: Can the base class access a function in the class whichis inheriting from it?

Discussion in 'C++' started by ngoonee@gmail.com, Mar 14, 2008.

  1. Guest

    Hi all,

    My intent is to code some algorith which repeatedly applies a certain
    comparison function in C++. The algorithm itself works fine, but I'm
    searching for easy ways to select the comparison function to be
    applied, preferably at run-time (ie. no preprocessor defines).

    A very simplified example of the idea I had:-

    class baseclass {
    private:
    virtual int compare(int a,int b);
    public:
    int do_something(int a, int b) {
    return compare(a,b);
    }
    };

    class class2:public baseclass {
    private:
    int compare(int a,int b) {
    return (b-a);
    }
    public:
    };

    class class1:public baseclass {
    private:
    int compare(int a,int b) {
    return (a-b);
    }
    public:
    };

    Hence, if I create an instance of class1 and call the function
    do_something, I'd like it to access the compare() function within
    class1. Obviously, however, it doesn't work as is, meaning the method
    I'm trying is not legal.

    1. Could anyone suggest a legal way of doing what I'm trying to
    accomplish, besides simply copy-pasting the whole code of
    do_something() into a seperate class?

    2. Is there any other way besides class inheritance to accomplish the
    above?

    Thank you all.
     
    , Mar 14, 2008
    #1
    1. Advertising

  2. red floyd Guest

    Re: Inheritance: Can the base class access a function in the classwhich is inheriting from it?

    wrote:
    > Hi all,
    >
    > My intent is to code some algorith which repeatedly applies a certain
    > comparison function in C++. The algorithm itself works fine, but I'm
    > searching for easy ways to select the comparison function to be
    > applied, preferably at run-time (ie. no preprocessor defines).
    >
    > A very simplified example of the idea I had:-
    >
    > class baseclass {
    > private:
    > virtual int compare(int a,int b);
    > public:
    > int do_something(int a, int b) {
    > return compare(a,b);
    > }
    > };
    >
    > class class2:public baseclass {
    > private:
    > int compare(int a,int b) {
    > return (b-a);
    > }
    > public:
    > };
    >
    > class class1:public baseclass {
    > private:
    > int compare(int a,int b) {
    > return (a-b);
    > }
    > public:
    > };
    >
    > Hence, if I create an instance of class1 and call the function
    > do_something, I'd like it to access the compare() function within
    > class1. Obviously, however, it doesn't work as is, meaning the method
    > I'm trying is not legal.
    >
    > 1. Could anyone suggest a legal way of doing what I'm trying to
    > accomplish, besides simply copy-pasting the whole code of
    > do_something() into a seperate class?
    >
    > 2. Is there any other way besides class inheritance to accomplish the
    > above?
    >

    What doesn't work?
    The only problem that I can see is that you haven't implemented
    baseclass::compare. Either provide an implmeentation or declare it as
    pure virtual.
     
    red floyd, Mar 14, 2008
    #2
    1. Advertising

  3. Guest

    Re: Inheritance: Can the base class access a function in the classwhich is inheriting from it?

    On Mar 14, 1:23 pm, red floyd <> wrote:
    > wrote:
    > > Hi all,

    >
    > > My intent is to code some algorith which repeatedly applies a certain
    > > comparison function in C++. The algorithm itself works fine, but I'm
    > > searching for easy ways to select the comparison function to be
    > > applied, preferably at run-time (ie. no preprocessor defines).

    >
    > > A very simplified example of the idea I had:-

    >
    > > class baseclass {
    > > private:
    > > virtual int compare(int a,int b);
    > > public:
    > > int do_something(int a, int b) {
    > > return compare(a,b);
    > > }
    > > };

    >
    > > class class2:public baseclass {
    > > private:
    > > int compare(int a,int b) {
    > > return (b-a);
    > > }
    > > public:
    > > };

    >
    > > class class1:public baseclass {
    > > private:
    > > int compare(int a,int b) {
    > > return (a-b);
    > > }
    > > public:
    > > };

    >
    > > Hence, if I create an instance of class1 and call the function
    > > do_something, I'd like it to access the compare() function within
    > > class1. Obviously, however, it doesn't work as is, meaning the method
    > > I'm trying is not legal.

    >
    > > 1. Could anyone suggest a legal way of doing what I'm trying to
    > > accomplish, besides simply copy-pasting the whole code of
    > > do_something() into a seperate class?

    >
    > > 2. Is there any other way besides class inheritance to accomplish the
    > > above?

    >
    > What doesn't work?
    > The only problem that I can see is that you haven't implemented
    > baseclass::compare. Either provide an implmeentation or declare it as
    > pure virtual.



    Perhaps I wasn't being clear enough, apologies. I don't want to (in
    any situation) use baseclass::compare. I will not be creating any
    objects of class baseclass, only of class1 and class2. I would like
    class1 and class2 to be able to use baseclass's do_something()
    function, but using their own unique versions of compare().

    Thank you for your prompt response.
     
    , Mar 14, 2008
    #3
  4. red floyd Guest

    Re: Inheritance: Can the base class access a function in the classwhich is inheriting from it?

    wrote:
    > On Mar 14, 1:23 pm, red floyd <> wrote:
    >> wrote:
    >>> Hi all,
    >>> My intent is to code some algorith which repeatedly applies a certain
    >>> comparison function in C++. The algorithm itself works fine, but I'm
    >>> searching for easy ways to select the comparison function to be
    >>> applied, preferably at run-time (ie. no preprocessor defines).
    >>> A very simplified example of the idea I had:-
    >>> class baseclass {
    >>> private:
    >>> virtual int compare(int a,int b);
    >>> public:
    >>> int do_something(int a, int b) {
    >>> return compare(a,b);
    >>> }
    >>> };
    >>> class class2:public baseclass {
    >>> private:
    >>> int compare(int a,int b) {
    >>> return (b-a);
    >>> }
    >>> public:
    >>> };
    >>> class class1:public baseclass {
    >>> private:
    >>> int compare(int a,int b) {
    >>> return (a-b);
    >>> }
    >>> public:
    >>> };
    >>> Hence, if I create an instance of class1 and call the function
    >>> do_something, I'd like it to access the compare() function within
    >>> class1. Obviously, however, it doesn't work as is, meaning the method
    >>> I'm trying is not legal.
    >>> 1. Could anyone suggest a legal way of doing what I'm trying to
    >>> accomplish, besides simply copy-pasting the whole code of
    >>> do_something() into a seperate class?
    >>> 2. Is there any other way besides class inheritance to accomplish the
    >>> above?

    >> What doesn't work?
    >> The only problem that I can see is that you haven't implemented
    >> baseclass::compare. Either provide an implmeentation or declare it as
    >> pure virtual.

    >
    >
    > Perhaps I wasn't being clear enough, apologies. I don't want to (in
    > any situation) use baseclass::compare. I will not be creating any
    > objects of class baseclass, only of class1 and class2. I would like
    > class1 and class2 to be able to use baseclass's do_something()
    > function, but using their own unique versions of compare().
    >


    Then declare it pure virtual...
    Note the "= 0" in the class below.

    What you have created is a well known design pattern called "Template"
    (not to be confused with C++ templates).

    class baseclass {
    private:
    virtual int compare(int a,int b) = 0;
    public:
    int do_something(int a, int b) {
    return compare(a,b);
    }
    };
     
    red floyd, Mar 14, 2008
    #4
  5. Guest

    Re: Inheritance: Can the base class access a function in the classwhich is inheriting from it?

    On Mar 14, 1:41 pm, red floyd <> wrote:
    > wrote:
    > > On Mar 14, 1:23 pm, red floyd <> wrote:
    > >> wrote:
    > >>> Hi all,
    > >>> My intent is to code some algorith which repeatedly applies a certain
    > >>> comparison function in C++. The algorithm itself works fine, but I'm
    > >>> searching for easy ways to select the comparison function to be
    > >>> applied, preferably at run-time (ie. no preprocessor defines).
    > >>> A very simplified example of the idea I had:-
    > >>> class baseclass {
    > >>> private:
    > >>> virtual int compare(int a,int b);
    > >>> public:
    > >>> int do_something(int a, int b) {
    > >>> return compare(a,b);
    > >>> }
    > >>> };
    > >>> class class2:public baseclass {
    > >>> private:
    > >>> int compare(int a,int b) {
    > >>> return (b-a);
    > >>> }
    > >>> public:
    > >>> };
    > >>> class class1:public baseclass {
    > >>> private:
    > >>> int compare(int a,int b) {
    > >>> return (a-b);
    > >>> }
    > >>> public:
    > >>> };
    > >>> Hence, if I create an instance of class1 and call the function
    > >>> do_something, I'd like it to access the compare() function within
    > >>> class1. Obviously, however, it doesn't work as is, meaning the method
    > >>> I'm trying is not legal.
    > >>> 1. Could anyone suggest a legal way of doing what I'm trying to
    > >>> accomplish, besides simply copy-pasting the whole code of
    > >>> do_something() into a seperate class?
    > >>> 2. Is there any other way besides class inheritance to accomplish the
    > >>> above?
    > >> What doesn't work?
    > >> The only problem that I can see is that you haven't implemented
    > >> baseclass::compare. Either provide an implmeentation or declare it as
    > >> pure virtual.

    >
    > > Perhaps I wasn't being clear enough, apologies. I don't want to (in
    > > any situation) use baseclass::compare. I will not be creating any
    > > objects of class baseclass, only of class1 and class2. I would like
    > > class1 and class2 to be able to use baseclass's do_something()
    > > function, but using their own unique versions of compare().

    >
    > Then declare it pure virtual...
    > Note the "= 0" in the class below.
    >
    > What you have created is a well known design pattern called "Template"
    > (not to be confused with C++ templates).
    >
    > class baseclass {
    > private:
    > virtual int compare(int a,int b) = 0;
    > public:
    > int do_something(int a, int b) {
    > return compare(a,b);
    > }
    >
    > };


    Thank you. I tried this but in itself it did not solve my problem. The
    issue was with me, however, and my incomplete understanding of
    polymorphism. It turns out that I shouldn't create an instance of
    class1 or class2 per se, instead I should have done the below:-

    // code fragment

    baseclass * bclass_ptr = new class1();
    int result = (*bclass_ptr).do_something(1,5);

    // end code fragment

    Thank you for your help, red floyd sir. Any further advise on the
    topic of polymorphism would be appreciated, though my immediate
    problem has been solved.
     
    , Mar 14, 2008
    #5
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. thechaosengine
    Replies:
    3
    Views:
    554
    =?Utf-8?B?Sm9obkF0V29yaw==?=
    Aug 24, 2005
  2. TJO
    Replies:
    2
    Views:
    398
  3. cppsks
    Replies:
    0
    Views:
    833
    cppsks
    Oct 27, 2004
  4. Alf P. Steinbach
    Replies:
    6
    Views:
    558
    John Carson
    Sep 3, 2005
  5. Replies:
    2
    Views:
    827
    Noah Roberts
    Jun 9, 2006
Loading...

Share This Page