|
Hi All,
I have a query related to virtual methods and access specifiers in C++ class. I have a two classes and their definition is as shown below
class Base
{
public:
virtual void PrintMethod()
{
cout << "Base class method called";
}
};
class Derived : public Base
{
private:
virtual void PrintMethod()
{
cout << "Derived class method called";
}
};
in main method
int main()
{
Derived der;
Base *ptr = &der;
ptr->PrintMethod(); ------------ (1)
// der.PrintMethod(); ------------ (2)
return 0;
}
When I execute the program the output I get is "Derived class method called" and this confused me a bit. I could not figure out properly why the derived class method was called when it is private in class Derived?
My guess is that the public function in class Base is inherited in Derived class and when the call was made the through the pointer the linker could only find the private definition of the function PrintMethod and hence it called it through the pointer which is actually pointing to the Derived class object.
If I try to call the function through the derived class object (as shown in 2), I get compilation error saying the private method is not accessible which is true.
So overall I was not satisfied with the reasoning I arrived at for the derived class method being called.
Can someone give me more insight into what actually is happening here?
Thanks and Regards
|
|
|
|
|
When you have a virtual function, the compiler will create a virtual table (also called vtable) in your class which contains the address of all virtual functions (in this case, the address of the Derived::PrintMethod). At that point, it doesn't make any difference if the derived virtual function is private or not. You are calling the function on a base pointer, and there's no way for the compiler to know if the derived function is public or not (the compiler has no way to know what is the real type of your pointer at compile time). The compiler just access the virtual table and redirect the call to the derived method.
|
|
|
|
|
The compiler may do just a static check on your function calls, on the other hand, polymorphism is a dynamic feature of the language.
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler.
-- Alfonso the Wise, 13th Century King of Castile.
This is going on my arrogant assumptions. You may have a superb reason why I'm completely wrong.
-- Iain Clarke
[My articles]
|
|
|
|
|
|
Dear All,
I have an issue with floating point precision with Visual Studio 2005 (2008 as well)
See the sample code.
const float f = 0.2f * 3;
CString str;
str.Format(_T( "%f"), f );
When you check the watch window, the variable will be having value 0.60000002(I expected 0.6). To confirm this again, I tried running with WinDBG, it has given a value 0.6000000238 in it's watch window
I doubt this may affect my calculation which should be very precise. I tried different floating point models using /fp compiler option. But always it has the same output. But the formatted string below gives 0.600000 as the result.
What could be the reason for this issue? Any solutions?
-Sarath.
"Great hopes make everything great possible" - Benjamin Franklin
|
|
|
|
|
I don't understand where is your problem exactly: only with the precision or when formating the string ?
For the precision problem, you can use a double instead of a float, you'll gain much more precision.
For the formating, you can supply the number of decimal points you want to show in the format string (just add a number before the 'f').
|
|
|
|
|
OK
try this code. then things will be more clear.
float f = 0.2f 0.6f;
f -= 0.2f;
f -= 0.2f;
f -= 0.2f;
if( f == 0.0f )
{
}
In this case, after subtracting 0.2 three times, the value should reach to 0.0f. But it's fails. because of the trailing additional digits in the floating point representation. The same case exists for double type as well.
-Sarath.
"Great hopes make everything great possible" - Benjamin Franklin
modified on Tuesday, February 3, 2009 6:59 AM
|
|
|
|
|
When working with doubles or floats, you should never compare numbers directly. This won't work. Instead, you have to use precision range when comparing them (for instance if the value is between -0.000001 and 0.000001, then you can say it is equal to 0. That's the only way to work with floating point values, because they will never be 100% precise and you have to keep that in mind.
|
|
|
|
|
Cedric Moonen wrote: for instance if the value is between -0.000001 and 0.000001, then you can say it is equal to 0. That's the only way to work with floating point values, because they will never be 100% precise and you have to keep that in mind
Yeap the sign associated with it was the real issue. it may remain negative (even I expect 0.0f)
-Sarath.
"Great hopes make everything great possible" - Benjamin Franklin
|
|
|
|
|
Sarath. wrote: the sign associated with it was the real issue
Shouldn't be - the IEEE standard requires that positive or negative zeros compare equal.
|
|
|
|
|
With double data type you'll get a better approximation (you know you can't get exact values)
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler.
-- Alfonso the Wise, 13th Century King of Castile.
This is going on my arrogant assumptions. You may have a superb reason why I'm completely wrong.
-- Iain Clarke
[My articles]
|
|
|
|
|
It's because standard floats and doubles cannot exactly represent 0.6.
The representation of 0.6 as a float can be determined by working out what sum of binary fractions (1/2n) best approximates it - you can see it's going to be something like 0.5 + 0.0625 + 0.03125 + .... - SpeedCrunch[^] (a nice calculator) gives it as this:
0b0.1001100110011001100110011001100110011001100110011001100110011001101
Infinitely recurring binary time...
Read this document[^] for the full story.
|
|
|
|
|
See here and here. In short, not all floating-point numbers can be stored in binary without some rounding.
"Old age is like a bank account. You withdraw later in life what you have deposited along the way." - Unknown
"The brick walls are there for a reason...to stop the people who don't want it badly enough." - Randy Pausch
|
|
|
|
|
Hello,
I am compling one of the sample projects which I got after installing WMSDK.
I am using VS2009 and I compiled the project from "C:\WMSDK\WMFSDK11\samples\Metadataedit" but getting error which tells that it's not getting declarations of some symbols/variables used in 'string.h'. I am confused thinking what setting am I missing ? can anybody please guide why I am getting those error ?
Thanks in Advance.
regards,
Supriya
|
|
|
|
|
Are you talking about std::string ? If yes, then you have to #include <string></string> and not #include <string.h></string.h> .
EDIT: BTW, it is in general usefull to provide the exact error message, and not your interpretation of the message.
|
|
|
|
|
sorry here are some of the errors..
1>c:\program files\microsoft visual studio 9.0\vc\include\string.h(48) : error C2065: '_MaxCount' : undeclared identifier
1>c:\program files\microsoft visual studio 9.0\vc\include\string.h(48) : error C3861: '_Out_opt_bytecap_': identifier not found
1>c:\program files\microsoft visual studio 9.0\vc\include\string.h(48) : error C2144: syntax error : 'void' should be preceded by ')'
1>c:\program files\microsoft visual studio 9.0\vc\include\string.h(48) : warning C4229: anachronism used : modifiers on data are ignored
1>c:\program files\microsoft visual studio 9.0\vc\include\string.h(48) : error C2059: syntax error : ')'
Regards,
Supriya
|
|
|
|
|
Check if your problem is similar to one described here[^].
|
|
|
|
|
Supriya Tonape wrote: can anybody please guide why I am getting those error ?
Have you tried including string (instead of string.h ) instead?
"Old age is like a bank account. You withdraw later in life what you have deposited along the way." - Unknown
"The brick walls are there for a reason...to stop the people who don't want it badly enough." - Randy Pausch
|
|
|
|
|
Yes I had tried that.
(sorry for late reply, I cudnt check mails.)
Regards,
Supriya.
|
|
|
|
|
Hi,
My C++ program (VS2005) has two parts. one part writes into a file and the other part reads from it.
The folder name is japanese. eg: C:\Documents and Settings\管理者
To read the file in this location,I am supposed to use an API (third party library) which takes the file location as a char*. I have the file location(C:\Documents and Settings\管理者) in a CString.
How do I convert this into a char* ?
I tried using the T2A macros, but the japanese string is not getting extracted. the char* pointer shows some junk charaters.
Any inputs on this ?
Thanks in advance.
|
|
|
|
|
It's better to seek the help of 3rd party library to provide Unicode interfaces. Other workarounds like renaming to ASCII and restoring it back after use will be painful.
-Sarath.
"Great hopes make everything great possible" - Benjamin Franklin
|
|
|
|
|
I m not sure but check if this helps you,
CString buf = _T("salut"); //the first string
char * Result; //the result
long len = wcslen (buf); //the length of "salut"
wcstombs (Result,buf,len); //conversion to char *
Result[len] = '\0';
|
|
|
|
|
Hi,
I would like to add some text in the cation of document. e.g. If I have a Test.doc then the caption for this document is Test.doc but I want to add some more text to it like "Mydoc" so the caption will become "Test.doc Mydoc". I know we need to change some registery entries but I want to change it for all office documents. Actually I m changing the extension of these documents as Test.gdoc so for all office docs with extension it should attach this caption.
Pls let me know that how could we achieve this.
Thanks
SNI
SNI
|
|
|
|
|
Using MFC? Override CFrameWnd::OnUpdateFrameTitle .
Here's the implementation I used to add a 'document is modified' marker:
void CMainFrame::OnUpdateFrameTitle(BOOL bAddToTitle)
{
if ((GetStyle() & FWS_ADDTOTITLE) == 0)
return;
CDocument* pDocument = GetActiveDocument();
if (bAddToTitle && pDocument != NULL)
UpdateFrameTitleForDocument(pDocument->GetTitle() + (pDocument->IsModified()?"*":""));
else
UpdateFrameTitleForDocument(NULL);
}
|
|
|
|
|
THanks for your reply but i need this for Winword document. Once we open any document (Test.doc), it will show its name at top left but I want to append my string to the cation of it "Test.doc (MyDoc)".
Do you have any idea how to do it?
SNI
SNI
|
|
|
|