1

如何在不改变现有类的上下文的情况下将自己的方法添加到现有类中。

例如 :

   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();
        }
4

1 回答 1

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()不是 made virtual,您会遇到各种名称隐藏问题,这就是您必须命名扩展函数的原因B::print2()

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

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

于 2013-07-14T11:52:47.507 回答