隐藏继承类的名称

时间:2013-10-29 03:48:57

标签: c++

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

  1. 投射物体,((CBar *)& foo) - >通过(1,2,3);
  2. 使用此语法,foo.CBar :: Pass(1,2,3);
  3. 使用CBar :: Pass。
  4. 在CFoo类声明中使用“using”语法

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

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

    谢谢,

1 个答案:

答案 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