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

N

ngoonee

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.
 
R

red floyd

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.
 
N

ngoonee

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.
 
R

red floyd

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);
}
};
 
N

ngoonee

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.
 

Ask a Question

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

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,768
Messages
2,569,574
Members
45,051
Latest member
CarleyMcCr

Latest Threads

Top