我有以下示例代码,我想知道在CBar类中访问Pass方法的正确方法。目前我已经找到了3种方法来访问这种方法,它们如下:
以下是测试此功能的简单项目示例。
foo.h中
#include "bar.h"
class CFoo :
public CBar
{
private:
double m_a;
double m_b;
public:
CFoo(void);
~CFoo(void);
void Pass(double a, double b);
};
Foo.cpp中
#include "Foo.h"
CFoo::CFoo(void)
{
m_a = 0.0;
m_b = 0.0;
}
CFoo::~CFoo(void)
{
}
void CFoo::Pass(double a, double b)
{
m_a = a;
m_b = b;
}
Bar.h
class CBar
{
int m_x;
int m_y;
int m_z;
public:
CBar(void);
~CBar(void);
void Pass(int x, int y, int z);
};
Bar.cpp
#include "Bar.h"
CBar::CBar(void)
{
m_x = 0;
m_y = 0;
m_z = 0;
}
CBar::~CBar(void)
{
}
void CBar::Pass(int x, int y, int z)
{
m_x = x;
m_y = y;
m_z = z;
}
我的主要课程DoStuff.cpp
#include "DoStuff.h"
#include "Foo.h"
CDoStuff::CDoStuff(void)
{
}
CDoStuff::~CDoStuff(void)
{
}
int main()
{
CFoo foo, foo1, foo2;
//This only gets to the Pass method in Foo.
foo.Pass(2.5, 3.5);
//Gets access to Pass method in Bar.
foo1.CBar::Pass(5,10,15);
//Can also case and access by location for the same result??
((CBar *) &foo2)->Pass(100,200,300);
return 0;
}
这些选项中的每一个都可行吗?有些人更喜欢吗?使用列出的任何一种方法是否存在缺陷?
我对foo.CBar :: Pass(1,2,3)语法特别好奇。
谢谢,
乙
答案 0 :(得分:2)
在这个具体的例子中,所有方法最终都会产生相同的结果。
一般情况下,结果可能会有所不同。
如果((CBar *) &foo)->Pass(1, 2, 3);
碰巧是虚函数,“强制转换”方法Pass
将保留调用的动态特性。演员表可以参考类型BTW ((CBar &) foo).Pass(1, 2, 3);
执行。在这种情况下使用C ++样式转换是一个更好的主意。
如果foo.CBar::Pass(1,2,3);
恰好是虚函数,则“限定名称”方法Pass
将抑制调用的动态特性,即保证调用CBar::Pass
。