Как я могу добавить свой собственный метод в уже существующий класс без каких-либо изменений в контексте уже существующего класса.
например :
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();
}
Чтобы расширить класс в 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 ++.
Других решений пока нет …