Can we use abstract class templating classes?

N

newbie

Say I have the following class:

class MyAbs {
virtual ~MyAbs() {}
virtual void foo() = 0;
virtual void bar() {cout << "abs::bar"; }
}

class MyDer1: public MyAbs {
MyDer1() {counter = 0; }
foo() { cout << "der1::foo--" << counter++; }
int counter;
}

class MyDer2: public MyAbs {
MyDer1() {counter = 100; }
foo() { cout << "der1::foo--" << counter--; }
int counter;
}
-----------------------------------------
Can I do something like this? Thanks

template <class Toy>
class MyTemplateClass{
Toy toy_;
Play() { toy_.foo(); }
}
 
J

Jim Langston

newbie said:
Say I have the following class:

class MyAbs {
virtual ~MyAbs() {}
virtual void foo() = 0;
virtual void bar() {cout << "abs::bar"; }
}

class MyDer1: public MyAbs {
MyDer1() {counter = 0; }
foo() { cout << "der1::foo--" << counter++; }
int counter;
}

class MyDer2: public MyAbs {
MyDer1() {counter = 100; }
foo() { cout << "der1::foo--" << counter--; }
int counter;
}
-----------------------------------------
Can I do something like this? Thanks

template <class Toy>
class MyTemplateClass{
Toy toy_;
Play() { toy_.foo(); }
}

Your code shows classes MyAbs, MyDer1 and MyDer2, yet your template shows
Toy. I'm presuming in my response that by
Toy toy_;
Play() ( toy_.foo(); )

you actually meant
MyAbs toy_;
Play() { toy_.foo(); }

No. Your template is attempting to instantize a class MyAbs which is a
virtual class. You couldn't do it in main so you couldn't do it in a
template. However, I believe you could do:

MyAbs* toy_ = new MyDer1;
Play() { toy_->foo(); }
 
N

newbie

Your code shows classes MyAbs, MyDer1 and MyDer2, yet your template shows
Toy. I'm presuming in my response that by
Toy toy_;
Play() ( toy_.foo(); )

you actually meant
MyAbs toy_;
Play() { toy_.foo(); }

No. Your template is attempting to instantize a class MyAbs which is a
virtual class. You couldn't do it in main so you couldn't do it in a
template. However, I believe you could do:

MyAbs* toy_ = new MyDer1;
Play() { toy_->foo(); }

Thanks. I am not sure

What I really want is to ask class MyTemplateClass behave clever
enough to
understand things like

///////////////////////////////////
class MyAbs {
virtual ~MyAbs() {}
virtual void foo() = 0;
virtual void bar() {cout << "abs::bar"; }

}

class MyDer1: public MyAbs {
MyDer1() {counter = 0; }
foo() { cout << "der1::foo--" << counter++; }
int counter;

}

class MyDer2: public MyAbs {
MyDer1() {counter = 100; }
foo() { cout << "der1::foo--" << counter--; }
int counter;
}
///////////////////////////////////////

template <class Toy>
class MyTemplateClass{
Toy toy_;
Play() { toy_.foo();
}

typedef MyTemplateClass<MyDer1> MyClass1;
typedef MyTemplateClass<MyDer2> MyClass2;
////////////////////////////////////////
int main() {
MyClass1 m1;
MyClass2 m2;
m1.Play();
m2.Play();
return 0;
}
 
A

Adrian Hawryluk

newbie said:
Say I have the following class:

class MyAbs {
virtual ~MyAbs() {}
virtual void foo() = 0;
virtual void bar() {cout << "abs::bar"; }
}

class MyDer1: public MyAbs {
MyDer1() {counter = 0; }
foo() { cout << "der1::foo--" << counter++; }
int counter;
}

class MyDer2: public MyAbs {
MyDer1() {counter = 100; }
foo() { cout << "der1::foo--" << counter--; }
int counter;
}
-----------------------------------------
Can I do something like this? Thanks

template <class Toy>
class MyTemplateClass{
Toy toy_;
Play() { toy_.foo(); }
}

Yeah, but you don't need to. You are using generics (although a limited
form if I understand the term correctly) in conjunction with templates
when it isn't really necessary *in the scope of this case*. You could
do the same thing without subclassing MyAbs. Of course whatever
MyTemplateClass takes as a parameter, it must have a function foo that
takes no parameters.

Generics is a runtime solution, "I want to plug in any class at runtime
that has this interface so that I may interact with it using those
interfaces", as opposed to templates which is a compile time solution "I
want my programme to emit code that will interact with this set of
classes/or constants in the way I define."

Although, by specifying the interface class, it does make it easy to see
what functions are needed. But again it is not necessary *in the scope
of this case*.


Adrian
--
_____________________________________________________________________
\/Adrian_Hawryluk BSc. - Specialties: UML, OOPD, Real-Time Systems\/
\ My newsgroup writings are licensed under the Creative Commons /
\ Attribution-Noncommercial-Share Alike 3.0 License /
\_____[http://creativecommons.org/licenses/by-nc-sa/3.0/]_____/
\/______[blog:__http://adrians-musings.blogspot.com/]______\/
 
A

Adrian Hawryluk

newbie said:
Thanks. I am not sure

What I really want is to ask class MyTemplateClass behave clever
enough to
understand things like

///////////////////////////////////
class MyAbs {
virtual ~MyAbs() {}
virtual void foo() = 0;
virtual void bar() {cout << "abs::bar"; }

}

class MyDer1: public MyAbs {
MyDer1() {counter = 0; }
foo() { cout << "der1::foo--" << counter++; }
int counter;

}

class MyDer2: public MyAbs {
MyDer1() {counter = 100; }
foo() { cout << "der1::foo--" << counter--; }
int counter;
}
///////////////////////////////////////

template <class Toy>
class MyTemplateClass{
Toy toy_;
Play() { toy_.foo();
}

typedef MyTemplateClass<MyDer1> MyClass1;
typedef MyTemplateClass<MyDer2> MyClass2;
////////////////////////////////////////
int main() {
MyClass1 m1;
MyClass2 m2;
m1.Play();
m2.Play();
return 0;
}
Again, yes, but unless you are going to pass out the object to something
that is going to take a MyAbs object which you may pass MyDer1 or
MyDer2, you do not need to subclass MyAbs to make it work.


Adrian

--
_____________________________________________________________________
\/Adrian_Hawryluk BSc. - Specialties: UML, OOPD, Real-Time Systems\/
\ My newsgroup writings are licensed under the Creative Commons /
\ Attribution-Noncommercial-Share Alike 3.0 License /
\_____[http://creativecommons.org/licenses/by-nc-sa/3.0/]_____/
\/______[blog:__http://adrians-musings.blogspot.com/]______\/
 

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

Forum statistics

Threads
473,774
Messages
2,569,596
Members
45,130
Latest member
MitchellTe
Top