J
junw2000
Is it possible to create an abstract base class without a pure virtual
function?
Thanks
Jack
function?
Thanks
Jack
Is it possible to create an abstract base class without a pure virtual
function?
Jerry said:It's entirely possible to create a class and _use_ it as an abstract
base class (i.e. you only ever derive from it, never instantiate it
directly) without a pure virtual function.
Using a pure virtual function enforces that intent -- i.e. the
compiler won't _let_ you instantiate a class that contains a pure
virtual function (or a derivative, unless all pure virtual functions
have been overridden).
It's entirely possible to create a class and _use_ it as an abstract
base class (i.e. you only ever derive from it, never instantiate it
directly) without a pure virtual function.
Thank a lot.
So how to do it? Could you give an example?
red said:I guess that OP could use a protected constructor or destructor, as well.
Is it possible to create an abstract base class without a pure virtual
function?
Rolf said:Well, there are way to make one that behaves similiar, but why would you
want to? You can always make the destructor pure if there is no other
member function that you could make pure.
Thats correct!
To elaborate more on Rolfs point,
A pure virtual function can have body but it can only be called from
the derived classes and not by user directly. So for example:
class A {
virtual void fun() = 0;
};
void a::fun() { _DO_SOMETHING_}
class B : public A {
void fun() {
A::fun(); // works fine
}
};
void main() {
Jack said:You shouldn't post advice here until you become aware of the fact that
there is no such thing as "void main()" in C++. The standard requires
that main() be defined with a return type of int. "void main()" is
ill-formed, requiring a diagnostic. The behavior of any executable
generated is completely undefined.
i think you shudnt be posting here till you spit that attitude out and
realize that this isnt my full time job and i am only trying to help
someone (It was a typo). Or is it that you dont have anything better to
post? Or is forum paying you for picking up garbage?
Alf said:* rami:
Jack is right. Your posting contained a few errors and misleading text,
but formulated in such a way that many people would take it seriously
(they won't after your reply quoted above, but that's another matter).
Here are three content problems:
* You state "can only be called from the derived classes".
That is incorrect.
* You use "_DO_SOMETHING_" as if that is a valid macro name.
It isn't valid, at least not for your own macro. Names starting
with underscore followed by uppercase are reserved.
* You use "void main".
Already discussed by Jack.
So, please try to pick up a little about how this group works.
Nobody (at least, not I! ;-)) will yell at you for helping out with
facts that you know, or stating opinions, or giving advice in general;
if such postings were removed, then this group would fall from being a
high-traffic, useful group to being a dried-out very sporadic traffic
and mostly useless. It's when the advice is formulated as authoritative
but is in fact something you really don't know anything about, that it's
a problem. Because it might then mislead people and cause new "urban
legends" to be perpetuated, misleading even more people than just those
who originally read your posting and thought it was good.
Cheers,
- Alf
--
A: Because it messes up the order in which people normally read text.
Q: Why is it such a bad thing?
A: Top-posting.
Q: What is the most annoying thing on usenet and in e-mail?
* You state "can only be called from the derived classes".
That is incorrect.
P.S. Whats wrong here?
AFAIK, pure virtual functions with bodies can be invoked from the
derived classes only..
Alf said:* rami:P.S. Whats wrong here?
AFAIK, pure virtual functions with bodies can be invoked from the
derived classes only..
Try this with your favorite compiler:
#include <iostream>
#include <ostream>
void say( char const s[] ) { std::cout << s << std::endl; }
struct Foo
{
virtual void bar() const = 0;
void g() const { Foo::bar(); }
};
void Foo::bar() const { say( "called" ); }
struct Foo2: Foo { void bar() const {} };
int main() { Foo2().g(); }
--
A: Because it messes up the order in which people normally read text.
Q: Why is it such a bad thing?
A: Top-posting.
Q: What is the most annoying thing on usenet and in e-mail?
rami said:Alf said:* rami:Try this with your favorite compiler:AFAIK, pure virtual functions with bodies can be invoked from the
derived classes only..
#include <iostream>
#include <ostream>
void say( char const s[] ) { std::cout << s << std::endl; }
struct Foo
{
virtual void bar() const = 0;
void g() const { Foo::bar(); }
};
void Foo::bar() const { say( "called" ); }
struct Foo2: Foo { void bar() const {} };
int main() { Foo2().g(); }
--
A: Because it messes up the order in which people normally read text.
Q: Why is it such a bad thing?
A: Top-posting.
Q: What is the most annoying thing on usenet and in e-mail?
Thanks!
So is the point - "can only be called _through_ the derived class
objects"?
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.