繁体   English   中英

C ++覆盖子类创建的对象的函数

[英]C++ override function of object created by subclass

我想知道是否可以在类中只覆盖一个函数而不创建一个全新的类。

我想要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?"
}

为了更改虚函数,您必须创建一个新类型 - 在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?"
}

您可以通过简单的更改获得所需的行为,其中包括将“虚拟”行为移动到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?"
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM