|
virtual inheritance is tricky.
consider class A to be a parent class. also consider A has a member int i;
then class B and class C inherites class A.
then class D inherties both B and C (multiple inheritance)
now if you create an object from D, C and B will be created in memory causing class A to be created in memory twice!!!???? (1 for B and 1 for C)
to avoid that we use the virtual inheritance.
multiple inheritance simply allow us to inherite from several classes....
hope that helped you...
Ask not what your application can do for you,
Ask what you can do for your application
|
|
|
|
|
|
(thumps forehead; forgot the look-in-the-faq thing again)
Software Zen: delete this;
|
|
|
|
|
'Multiple inheritance' means that a class is derived from more than one base class. For example, you could have the following:
class Boy {
public:
virtual void Walk();
void Speak();
int Age;
};
class Girl {
public:
virtual void Walk();
void Speak();
int Age;
};
class Infant {
virtual void Walk();
void Speak();
};
class MaleChild : public Boy, Infant {
public:
virtual void Walk();
void Speak();
}; The MaleChild class has two base classes, Boy and Infant . This means that an object of the MaleChild class is both a Boy and an Infant .
In simple terms, the 'virtual' mechanism lets you refer to an object through a base class pointer and actually call derived class methods. Using the classes in my earlier example, suppose we have the following:
MaleChild mc1;
Boy *boy1 = &mc1;
boy1->Walk();
boy1->Speak(); The statement boy1->Walk(); calls the Walk() function implemented by the MaleChild class through virtual inheritance. Walk() functions in the derived class 'override' those in the base class.
The statement boy1->Speak(); , on the other hand, calls the Speak() function directly in the Boy class.
This lets you define a behavior in a base class, and then alter that behavior in a derived class. For example, we could have the following implementation of the above classes:
void Boy::Walk()
{
cout << "I am a boy; "
}
void MaleChild::Walk()
{
Boy::Walk();
if (Age < 1) cout << "I can not walk; I am too young.";
else cout << "I am walking.";
} Assume the Age member is set to 0. If you call Walk() as follows:
MaleChild mc1;
Boy *boy1 = &mc1;
boy1->Walk(); you will see "I am a boy; I can not walk; I am too young." displayed. The boy1->Walk(); actually calls the MaleChild::Walk function through the virtual mechanism. The implementation of the MaleChild::Walk function calls the base class implementation to get the 'default' behavior (displaying "I am a boy; "), and then alters that behavior by displaying a message based on the value of the Age member.
Multiple inheritance is useful when you want to combine the behaviors of two types of objects. In our example, we are combining the behaviors of the Boy class and the Infant class to create a MaleChild class. Virtual inheritance is useful when you want to customize the behavior of a class.
Software Zen: delete this;
|
|
|
|
|
Hi,
I've noticed that the dialog-box programs I write using Visual C++ studio exit when the escape key is pressed. Does anyone know how I can stop this.
Thanks - Gary.
|
|
|
|
|
You need to override the OnCancel function, and remove the call to CDialog::OnCancel.
|
|
|
|
|
Thanks alot! That's worked! - Gary.
|
|
|
|
|
|
Hi All,
I have an arbitrarily large block of binary data (a sequence of bytes). I want to write a function:
int FindBit(BYTE* fisrtByte, int numBytes)
that can be passed a pointer to the start of the data (firstByte), and the number of bytes of data (numBytes), and find the first occurrence of a "1" bit. e.g., if I pass a pointer to the following 3 bytes of binary data:
00001101 10110101 10110101
I need the function to return 5 - because the first non-zero bit is in position 5.
Has anyone ever done something similar?
Is there an efficient way to do this ?
Thanks,
Neil Humphreys.
|
|
|
|
|
Hi,
This would work.
int FindBit(BYTE* firstByte, int numBytes){
int pos = 0;
int index = 0;
BYTE current_bit = 1 << 8;
while(index != numBytes){
if((firstByte[index] & current_bit) != 0)
break;
pos++;
current_bit = current_bit >> 1;
if(current_bit == 0){
current_bit = 1 << 8;
index++;
}
}
return pos;
}
NOTE: With your example, 00001101 10110101 10110101, this function would return a 4, because the count starts from zero. So if you want the count to start at 1, you'd have to add a 1 to the return value.
|
|
|
|
|
Sorry, I've corrected some things.
int FindBit(BYTE* firstByte, int numBytes){
int pos = 0;
int index = 0;
BYTE current_bit = 1 << 7;
while(index != numBytes){
if((firstByte[index] & current_bit) != 0)
break;
pos++;
current_bit = current_bit >> 1;
if(current_bit == 0){
current_bit = 1 << 7;
index++;
}
}
return pos;
}
NOTE: With your example, 00001101 10110101 10110101, this function would return a 4, because the count starts from zero. So if you want the count to start at 1, you'd have to add a 1 to the return value.
|
|
|
|
|
Hmmm. Just for fun, here's a slightly different approach:
int FindBit(BYTE *firstByte,int numBytes)
{
int result = -1;
int index = 0;
while ((index < numBytes) &&
(firstByte[index] == 0)) {
index++;
}
if (index < numBytes) {
result = index * 8;
BYTE mask = 0x01;
while ((firstByte[index] & mask) == 0) {
mask <<= 1;
result++;
}
}
return result;
} My version of FindBit returns -1 in case there are no 1 bits. Also note that I'm assuming 'Intel' byte/bit ordering.
Software Zen: delete this;
|
|
|
|
|
Can any one help me to solve this project ??
Obstacle Course
In this program you will implement the Obstacle Course specification using the Object-Oriented C++ language.
Problem Specification:
Design a program to simulate a race through an obstacle course. Racers start at the starting line and move one space at a time. The race ends when the first racer crosses the finish line.
Your program should be able to support a variety of racer classes with different movement strategies.
One type of racer always moves forward. If there's an obstacle in the way, the racer crashes into it and is out of the race.
Another moves forward unless that would mean running into an obstacle. If there is an obstacle in front of it, it always tries moving right, left, or backward, in that order.
Another moves forward unless that would mean running into an obstacle. If there is an obstacle in front of it, it randomly chooses to move right, left, or backward.
Another moves randomly, except that it never runs into an obstacle. For example, if moving right will run into an obstacle, it will randomly choose one of the directions of either forward, backward or left to move.
You should come up with at least one other type of racer strategy of your own, such as diagonal movement of forward-right, forward-left, backward-right or backward left. It will shun obstacle in its intended direction and choose the next diagonal direction as described in that order.
Your program should read in an obstacle course configuration. It should construct a number of racers and place them at the starting line. The user should be able to choose the number of racers and also to choose their types (or movement strategies). You could allow them to choose the type of each racer, or you could allow them to choose a type for each run of the simulation, and all racers in a given run would have the same type. It is optional for your program to graphically display the state of the obstacle course and obstacles and racers in it at the end of each time unit, but you are encouraged to do so. When the first racer crosses the finish line, your program should report which racer finished first, and its winning time.
The race environment should be modelled as a class in the form of a matrix that resembles a chess board. The base Racer class should contain some pure virtual function that executes the movement strategy. Each of these different Racer type is a derived class of the general base Racer class. You should develop an appropriate size of the racing matrix for this simulation program.
|
|
|
|
|
I'll be happy to help. I can have a working program ready in 3 days, complete with impressive graphics. I charge $250 an hour for my services and require 50% up front. The remainder is due upon delivery of the project.
As several CodeProject old-timers will attest, I'm very speedy in solving homeworks assignments, writing Computer Science term papers, and coding projects (esp. those due for final exams and thesis defenses). Feel free to contact me if you're interested!
/ravi
My new year's resolution: 2048 x 1536
Home | Articles | Freeware | Music
ravib@ravib.com
|
|
|
|
|
Only half up front?
Software Zen: delete this;
|
|
|
|
|
|
umm but i just need a simple one ... its ok without graphics...
|
|
|
|
|
Ravi Bhavnani wrote:
I can have a working program ready in 3 days, complete with impressive graphics. I charge $250 an hour for my services and require 50% up front.
Which amounts to what? If you work 24x7 for those three days, the total bill would be $18,000 with $9,000 being due up front. Yes?
"Opinions are neither right nor wrong. I cannot change your opinion. I can, however, change what influences your opinion." - David Crow
|
|
|
|
|
Yes. Actually I was contemplating an 8-hour billable work day, resulting in a mere $3K, with $1.5K due up front. But of course I was being facetious, as you probably guessed.
/ravi
My new year's resolution: 2048 x 1536
Home | Articles | Freeware | Music
ravib@ravib.com
|
|
|
|
|
|
here's my code:
void CfirstView::OnInitialUpdate()
{
CfirstView::OnInitialUpdate();
GetParentFrame()->RecalcLayout();
ResizeParentToFit();
AfxMessageBox("APN Initialized failed.");
}
however, the message box did not appear when i execute the compiled file.
can anyone help me on this one? is there some initialization i forgot to add?
|
|
|
|
|
windcar04 wrote:
void CfirstView::OnInitialUpdate()
{
CfirstView::OnInitialUpdate();
Looks like you are going in a constant recursive loop. Call the base class' OnInitialUpdate.
"You're obviously a superstar." - Christian Graus about me - 12 Feb '03
"Obviously ??? You're definitely a superstar!!!" mYkel - 21 Jun '04
Within you lies the power for good - Use it! Honoured as one of The Most Helpful Members of 2004
|
|
|
|
|
Looks like you are going in a constant recursive loop. Call the base class' OnInitialUpdate.
but i am sure it is not this problem. OnInitialUpdate does not seems to be called at all....
|
|
|
|
|
Even if this is not the error you are trying to find, it is a mistake. You must call the base class for the OnInitialUpdate() call in your routine.
Steve
|
|
|
|
|
thanks for the reply
okay, now this sounds stupid but how do i call the base class in this case?
|
|
|
|