1

我有以下示例代码,我想知道在 CBar 类中访问 Pass 方法的正确方法。目前我已经找到了 3 种访问此方法的方法,它们如下:

  1. 投射对象,((CBar *) &foo)->Pass(1, 2, 3);
  2. 使用这种语法, foo.CBar::Pass(1,2,3);
  3. 在 CFoo 类声明中使用“使用”语法,使用 CBar::Pass。

以下是测试此功能的简单项目示例。

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;
}

酒吧.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);
};

条形图.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) 语法特别好奇。

谢谢,

4

1 回答 1

2

在这个特定示例中,所有方法最终都会产生相同的结果。

在一般情况下,结果可能会有所不同。

如果碰巧是一个虚函数,“cast”方法((CBar *) &foo)->Pass(1, 2, 3);将保留调用的动态特性。Pass可以根据引用类型 BTW 执行强制转换((CBar &) foo).Pass(1, 2, 3);。在这种情况下,使用 C++ 样式转换是一个更好的主意。

如果碰巧是一个虚函数, “限定名称”方法foo.CBar::Pass(1,2,3);将抑制调用的动态特性Pass,即保证调用CBar::Pass.

于 2013-10-29T03:59:47.907 回答