是否可以为同一类的不同对象定义相同的函数?

时间:2015-12-28 10:13:37

标签: c++

可以为同一类的不同对象定义相同的函数吗?

在A.h

class Hello{


public:

void myfunction();


}

的main.cpp

Hello B0,B1;
// Here I want to define the function 'myfunction' for each object differently 



int main(){

B0.myfunction();
B1.myfunction();
}

这可能吗?

3 个答案:

答案 0 :(得分:1)

不直接,我想知道为什么你想要这样做,如果你真的希望它们是同一类类型的对象?这就是继承和virtual函数的用途!如果您希望它们的行为不同,您应该使它们成为不同(但相关)的类。

那就是说,我可以想到一种方法来实现这样的目标。 std::function

有一个类成员,如std::function<void(Hello*)> myfunctionimpl;,然后是成员函数void myfunction() { myfunctionimpl(this); }

然后在Hello的构造函数中,您可以将myfunctionimpl设置为指向其他函数或lambda的指针。例如,以下内容:

#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,它允许您编写小函数,这可能是您在构造每个对象时提供自定义行为的过程。 lambdas有很多教程,for instance

答案 1 :(得分:1)

不,同一个类的所有实例的成员函数的行为相同。但是,行为可以取决于对象的状态。例如,您可以将函数指针存储在数据成员中,并在成员函数中调用指向的函数。因此,成员函数对每个实例执行完全相同的操作:调用成员指向的函数,但如果指向的函数不同,则观察到的行为可能完全不同。

此外,如果函数是虚函数,则不同子类的实例可以不同地覆盖虚函数。

答案 2 :(得分:0)

从评论

开始
  

我正在尝试使用c ++和opengl创建一种框架。假设我有一个类的对象让我们说Button有一个函数onClick。在单击按钮时,不同的用户应该能够以自己的方式定义功能。

请参阅here以获取Herb Sutter关于virtuality主题的精彩文章,因为在您考虑构建问题和构建框架中描述的功能时,您会看到这一点。

  

问题很陈旧,但人们仍然不断问他们,

一个建筑框架可能对

感兴趣
  1. 多态性指针和类继承;
  2. 虚函数是一个成员函数,其行为可以在派生类中重写。