Re: Inherited constructors (templates)
On May 21, 11:29 am, Johannes Bauer <dfnsonfsdu...@gmx.de> wrote:
Hello group,
I'm having a problem with inheritance and I've run out of ideas. I'm
trying to encpsulate threads in a nice(tm) way. Therefore I declared a
template class:
template <typename ArgumentType, typename ReturnType> class Thread
with a purely virtual method
virtual ReturnType Action() = 0;
of which my actual threads should inherit from:
class AddingThread : public Thread<int*, int> {
public:
int Action() {
int sum = 0;
for (unsigned int i = 0=
; i < 10; i++) {
sum += =
Data[i];
}
return sum;
}
};
Now I want to call that thing just like
int foo[10];
memset(foo, 0, sizeof(foo));
foo[5] = 9;
AddingThread t1(foo);
int result = t1.join();
The problem I get is:
threadtest.cpp: In function =91int main()':
threadtest.cpp:23: error: no matching function for call to
=91AddingThread::AddingThread(int [10])'
threadtest.cpp:6: note: candidates are: AddingThread::AddingThread()
threadtest.cpp:6: note: AddingThread::Add=
ingThread(const
AddingThread&)
I can solve it, of course, by doing:
AddingThread(int *x) : Thread<int*, int>(x) { }
Where the "Thread" constructor does all the magic (i.e. actually
creating the thread and calling the trampoline to kick off "Action").
However, I do not want this redundant constructor delegation -
I'm not sure if I would call this "delegation" - You are not calling
any of the sibling constructors here, rather you are calling the
parent constructor. The parent constuctor in turn will do the work of
initializating the parent object - not the entire child object. Hence
this isn't really a "complete delegation" in that sense. The child
constructor is still needed to initialized the entire child object.
is it possible to tell the compiler to always use only the parent's
constructor of identical prototype if no child constructor is available?
No, because if a child constructor is "not available" then the child
object will not get constructed. A parent constructor can only be
called through a child constructor. If an appropriate child
constructor is not available the compiler has no way of knowing what
to call. It can't really call the "similar" parent constructor
directly, because that would only end up in initializing the base-
portion of the object being constructed.
Maybe I'm also thinking just in a very wrong way, maybe inheritance
isn't even the way to go here. Some other ideas maybe?
If you have multiple kinds of threads, say AddingThread,
SubtractingThread etc - that might be accessed using the same ABC/
interface (i.e. using an is-a relationship) then inheritance would be
an appropriate way to go. However, each of your derived classes would
need to have their own constructors. Constructors are never
inherited.