由子类创建的对象的c++重写函数

C++ override function of object created by subclass

本文关键字:重写 函数 c++ 对象 创建 子类      更新时间:2023-10-16

我想知道是否有可能在一个类中重写一个函数而不创建一个全新的类。

我希望bObj1.foo();输出"foo!",bObj2.foo()输出"foo?",但目前它们都输出"foo!"。

#include <iostream>
using namespace std;
class B {
    public:
    virtual void foo() { cout << "foo!" << endl; }
};
class A {
    public:
    B f();
};
B A::f() {
    B bObj;
    return bObj;
}
class C : public A {
};
int main()
{
    A aObj;
    B bObj1 = aObj.f();
    bObj1.foo(); // "foo!"
    C cObj;
    B bObj2 = cObj.f();
    bObj2.foo(); // "foo?"
}

您可以通过简单的更改获得您想要的行为,这包括将"虚拟"行为移动到a和C类。

这里我修改了你的应用程序以返回预期的结果:

#include <iostream>
using namespace std;
class A;
class B {
public:
    B(A& a) : aref(a) {}
    void foo();
private:
    A& aref;
};
class A {
public:
    B f();
    virtual void foo() { cout << "foo!" << endl; }
};
B A::f() {
    B bObj(*this);
    return bObj;
}
class C : public A {
public:
    virtual void foo() { cout << "foo?" << endl; }
};
void B::foo() { aref.foo(); }
int main()
{
    A aObj;
    B bObj1 = aObj.f();
    bObj1.foo(); // "foo!"
    C cObj;
    B bObj2 = cObj.f();
    bObj2.foo(); // "foo?"
}

为了改变虚函数,你必须创建一个新的类型——在c++中没有办法绕过这个。然而,另一种机制——函数对象——可以满足你的需要。

#include <functional>
#include <iostream>
using namespace std;
class B {
public:
    B(function<void ()> foo_impl) : foo_impl(foo_impl) {}
    void foo() {foo_impl();}
private:
    function<void()> foo_impl;
};
class A {
public:
    virtual B f();
};
B A::f() {
    B bObj([](){cout << "foo!" << endl;});
    return bObj;
}
class C : public A {
public:
    virtual B f() override;
};
B C::f() {
    B bObj([](){cout << "foo?" << endl;});
    return bObj;
}
int main()
{
    A aObj;
    B bObj1 = aObj.f();
    bObj1.foo(); // "foo!"
    C cObj;
    B bObj2 = cObj.f();
    bObj2.foo(); // "foo?"
}