Не сразу, и мне было бы интересно, почему вы хотите это сделать, если вы действительно хотите, чтобы они были объектами одного типа? Это то, на что наследуются функции и функции virtual
! Если вы хотите, чтобы они вели себя по-другому, вы должны сделать их разными (но связанными) классами.
Тем не менее, я могу думать об одном способе добиться чего-то подобного. std::function
.
У члена класса, как std::function<void(Hello*)> myfunctionimpl;
, а затем функцию-член void myfunction() { myfunctionimpl(this); }
Затем в конструкторе Hello
, вы можете установить myfunctionimpl
как указатель на какой-либо другой функции, или с лямбда. Например, следующие:
#include <functional>
#include <iostream>
class Hello {
public:
typedef std::function<void(Hello*)> MyFunctionType;
private:
MyFunctionType myfunctionimpl; // this holds the customisable function object
public:
Hello(const MyFunctionType& mf) // construct with a custom function object passed in
: myfunctionimpl(mf)
{}
Hello() // construct with a default function object
: myfunctionimpl([](Hello *h) {
std::cout << "Default function called on " << h << '\n';
})
{}
Hello(int){} // dummy to leave function object unset
void myfunction() {
// call the function object, only if it is safe to do so
if (this->myfunctionimpl) {
this->myfunctionimpl(this);
}
else {
std::cerr << "myfunctionimpl not set!\n";
}
}
};
void freeFunction(Hello*)
{
std::cout << "freeFunction\n";
}
int main()
{
Hello h1; // default
Hello h2(1); // not set
Hello h3(freeFunction); // custom function
h1.myfunction();
h2.myfunction();
h3.myfunction();
}
печатает:
Default function called on 0x7fffa12518e0
myfunctionimpl not set!
freeFunction
Так вот функция членmyfunction
ведет себя так же, как для каждого экземпляра; вызывает объект функции myfunctionimpl
(если он установлен). Но вы можете настроить объект функции, который вызывается для каждого экземпляра, поскольку это просто данные класса.
Конструктор по умолчанию демонстрирует использование lambdas, что позволяет вам писать небольшие функции на месте, что, вероятно, вам нужно, чтобы обеспечить настраиваемое поведение при построении каждого объекта. Есть много учебных пособий для лямбда, for instance.
Вы имеете в виду полиморфизм или виртуальную функцию? – user1436187
Я пытаюсь создать своего рода фреймворк с использованием C++ и opengl. Предположим, что у меня есть объект класса, который позволяет говорить Button, у которого есть функция onClick. При нажатии кнопки разные пользователи должны иметь возможность определять функцию по-своему. Мне было интересно, как это можно добиться на C++ ... например, есть @override в Android –
Вы хотите делать то же самое на каждом нажатии кнопки - найдите то, что пользователь указал, должно происходить на этом конкретном нажатии кнопки и делать то, что пользователь указал. –