-
August 16th, 2009, 06:07 AM
#1
multiple inheritence help
#include <iostream>
using namespace std;
class A
{
public:
int a;
A() : a(1234) {};
};
class B : virtual public A
{
public:
B() {a = 2345;};
};
class C : public A
{
public:
C() {a=3456;};
};
class E: virtual public A
{
public:
E() { a = 4567; };
};
class D: public B, public C
{
};
class F: public D, public E
{
};
void main()
{
F f;
//HERE cout << f.a;
cout << f.E::a << "\n";
cout << f.D::B::a << "\n";
cout << f.D::C::a << "\n";
}
1. When I comple the above code using cl.exe from microsoft command line compiler, it compiles find and the output is the following:
4567
4567
3456
When I compiler the above code using bcc32 (borland c++ command line compiler), I see the following
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
testmi.cpp:
Error E2090 testmi.cpp 41: Qualifier 'B' is not a class or namespace name in fun
ction main()
Error E2090 testmi.cpp 42: Qualifier 'C' is not a class or namespace name in fun
ction main()
*** 2 errors in Compile ***
Who is correct???
2. I should have one virtual instance F:::B::A::a and F::E::A::a and one non-virtual instance through F:::C::A::a
4567 is what E initialized a with, why do we see this? why no see what B initialized? How to initialize a in F or in D in the constructor?
3. How to make //HERE commented out code compile and work, and refer to the one-virtual A instance, with out doing any using?? (is that possible?)
-
August 16th, 2009, 08:24 AM
#2
Re: multiple inheritence help
I compiled your code as it is, and I didn't get errors.
I used gcc to compile the code.
Given below is a program that might help to understand how memory is allocated in a virtual base, see if this helps:
It displays the memory address in each case, making to understand better.
Code:
#include <iostream>
using std :: cout;
using std :: endl;
class ClassA
{
public:
int data;
};
class ClassB : public ClassA
{};
class ClassC : virtual public ClassA
{};
class ClassD : virtual public ClassA
{};
class ClassE : public ClassB, public ClassC, public ClassD
{};
int main()
{
system("clear");
ClassE objE;
cout << "&(objE.ClassB :: data) = " << &(objE.ClassB :: data) << endl
<< "&(objE.ClassC :: data) = " << &(objE.ClassC :: data) << endl
<< "&(objE.ClassD :: data) = " << &(objE.ClassD :: data) << endl;
return(0);
}
small suggestion:
--------------------
you could use code tags [code_] [/code_] (without the underscore) to retain the formatting.
-
August 16th, 2009, 01:13 PM
#3
Re: multiple inheritence help
1. Borland is an old compiler.
2. The "E" part of "F" is initialized after the "D" part, and overwrites the value.
3. "F" contains two members with the name "a". If you want to refer to one of them without fully qualifying the name, you're going to have to tell the compiler which.
Why would you ever want to use something like this?
Tags for this Thread
Posting Permissions
- You may not post new threads
- You may not post replies
- You may not post attachments
- You may not edit your posts
-
Forum Rules
|
Click Here to Expand Forum to Full Width
|