Re: Pure virtual functions: declaring a function in a base class
Hey Alf,
Thanks for the reply.
I don't see why I should declare a function "virtual" to override
a virtual function, I noly need to declare it virtual in the base
class, not in the derived class, but maybe I misunderstood what you
said.
That being said, I still don't understand why the compiler won't
take B's func1 as an override for class A. I understand your proposals
and agree with them, but I would like to understand why the compiler
won't override func1(). Maybe I just need to go back and read about c+
+ compiler implementation...
You understood the problem perfectly, I'll go and read the FAQ
about posting...
Thanks,
Mart=EDn.
On Aug 25, 12:35 am, "Alf P. Steinbach /Usenet" <alf.p.steinbach
+use...@gmail.com> wrote:
* Martin, on 25.08.2010 05:11:
Why doesn't this work? Is there a way to achieve it?
Compiler complains about func1() not being defined in class C, which
inherits it from class B.
class A
{
public:
virtual void func1() = 0;
}
class B
{
public func1()
{
printf("test");
}
};
class C : public B, public A
{
};
int _tmain(int argc, _TCHAR* argv[])
{
C c;
c.func1();
return 0;
}
Presumably you want the implementation in B to override the one in A.
And although you're not posting your real code, the typing mistakes that =
you've
made seem to indicate that you come from a Java background. Which is help=
ful in
helping you. But in general, don't assume that your readers are telepaths=
and
can see what's only in your head or on your screen: that's just stupid. P=
ost
*real code*. See the FAQ about how to ask about Code That Does Not Work.
Now, B::func1 is not virtual, so it can't override anything.
However, if you make B::func1 virtual then you still don't get an overrid=
e, only
a call ambiguity. The compiler sees 2 possibilities for which function yo=
u're
trying to call. And nothing decides between them.
You can either
* add an override in class C, e.g. calling the B::func1, or
* make A an abstract class, which means change the inheritance so =
that C
inherits B inherits A (in this case func1 becomes virtual in B=
since it's
already virtual in A, and B::func1 becomes an override of A::f=
unc1), or
* make A a logical interface, which means let B inherit virtually =
from A and
let C inherit virtually from A, and in this case B implements =
the A
interface A for class C, at some run time and design level cos=
t.
That said, there is no such thing as '_tmain' in C++. It's a Microsoft
monstrosity, and moreover it's a monstrosity (only) in support of Windows=
9x,
which one may presume that you're not out to support? Use a standard 'mai=
n'.
You don't use the 'main' arguments so no point in declaring them.
Finally you can omit the 'return 0', since 'main' returns 0 by default.
Cheers & hth.,
- Alf
--
blog at <url:http://alfps.wordpress.com>- Hide quoted text -
- Show quoted text -