如何在不存在预先存在的类的上下文中进行任何更改的情况下,将自己的方法添加到预先存在的类中。
例如:
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();
}
答案 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 ++的路线图中。