C ++中的接口和抽象类属性

时间:2017-05-01 20:00:20

标签: c++

我有一个"接口",名为Base,定义如下:

struct Base {
    int number(){
        return 17;
    };
};

现在,Derived类实现了方法number

struct Derived: Base {
    int number() {
        return 42;
    }
};

最后,其他一些对象将使用从Base派生的任何类。

struct Other {
    Base b;
    Other(Base b): b(b) {
        cout << b.number() << endl;
    }
};

问题在于,在使用Other类构造Derived时,从基类调用方法number。以下打印&#39; 17&#39;而不是&#39; 42&#39;。

Derived d;
Other o(d);

如何解决这个问题?

备注。我在Java中学习了OOP; c ++对我来说是新的。

2 个答案:

答案 0 :(得分:3)

首先,您应该标记number() virtual并在Derived中覆盖它:

struct Base {
    virtual int number(){
        return 17;
    };
};

但这还没有解决问题。在Other结构中,成员bBase类型的对象,因为它是一个对象(而不是指针/引用),您传递的任何派生将被切成仅仅Base {1}}对象。你应该做的是将信息保存在指针或引用中:

struct Other {
    Base* b;
    Other(Base* b): b(b) {
        cout << b->number() << endl;
    }
};

Derived d;
Other o(&d);

请注意悬挂指针与此设置。

答案 1 :(得分:1)

你需要使你的函数成为虚拟函数,并在你的Other类中传递一个引用或指向Base。