如何向类添加方法(帮助函数)?

时间:2013-07-14 09:51:47

标签: c++ c++11 non-member-functions helper-functions

如何在不存在预先存在的类的上下文中进行任何更改的情况下,将自己的方法添加到预先存在的类中。

例如:

   A.hpp
        class A
        {
        public :
        void print1()
        {
          cout << "print1";
        }
        };

    B.hpp
        //add a helper function to class A
        //for example:
        A::print2()
        {
        cout << "print2";
        }

     main.cpp

        #include "A.hpp"
        #include "B.hpp"
        main()
        {
           A a1;
           a1.print2();
        }

1 个答案:

答案 0 :(得分:4)

要在C ++中扩展类,请区分两种情况。

如果新功能可以用当前界面表示,请使用非会员功能

// B.hpp
void print2(A const& a)
{
    // pre-call extensions (logging, checking etc.)
    a.print1();
    // post-call extensions (logging, checking etc.)
}

如果新功能需要有关当前实现的知识,请使用类继承

// B.hpp
// WARNING: here be dragons, read on before using this in production code
class B: public A
{
public:
    void print2() const // compiler-generated signature: void print2(B const*)
    {
        // pre-call extensions (logging, checking etc.)
        print1();
        // post-call extensions (logging, checking etc.)
    }
};

但是,从一个不打算成为基类的类派生,可能很危险。特别是,如果A没有virtual析构函数,如果您使用指针动态分配B个对象,它们将被解除分配,就好像它们一样指向A个对象的指针。

此外,由于A::print1()未成为virtual,因此您会遇到各种名称隐藏问题,这就是您必须为扩展函数B::print2()命名的原因。

长话短说:知道你在写什么类课程。如果要基于类实现扩展行为,那么最好使其适合作为基类(虚拟析构函数,可以覆盖的虚函数)。否则,将您的类标记为final(新的C ++ 11上下文关键字)。如果您尝试覆盖现有函数,这将生成编译器警告。

注意:在其他语言(尤其是D)中,可以让编译器在看到语法print2(a)时自动查找非成员函数a.print2()。不幸的是,这种统一函数调用语法尚未出现在C ++的路线图中。