Re: Pure virtual functions: declaring a function in a base class
* 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 helpful 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. Post
*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 override, only
a call ambiguity. The compiler sees 2 possibilities for which function you'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::func1), 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 cost.
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 'main'.
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>