【问题标题】:C++: overriding pure virtual member variable?C++:覆盖纯虚拟成员变量?
【发布时间】:2011-03-31 16:52:17
【问题描述】:

这个问题最好用代码来描述。我有一个名为Vertex 的类,其中包含一个名为Params 的类的实例:

class Params {
    virtual Params operator + (Params const& p) = 0;
};

class Vertex {
    public:
        Params operator + (Params const& ap) const {
            return p + ap
        };

        virtual float eval() = 0;

    private:
        Params const p;
};

我还有一个名为 EllParams 的类,它派生自 ParamsEllVertex,它派生自 Vertex。我想知道的是如何在Vertex 中处理EllVertex 中的私有成员变量p:我希望它是EllParams 类型。有没有办法让p 虚拟/覆盖它?还是我应该寻找解决方案的模板?

【问题讨论】:

  • 无法将数据成员设为“虚拟”。我会尽量避免继承树的非叶类中的数据成员;如果您需要从基类访问数据成员,则创建一个可以在派生类中实现的虚函数。
  • 您正在尝试使用抽象类型的数据成员。那是行不通的。改用指针(您可能想要使用智能指针)。这样,虚拟行为就会起作用。

标签: c++ templates inheritance oop virtual


【解决方案1】:

嗯...您需要以某种方式在Vertex 中初始化Params。所以让它成为Vertex 构造函数的参数。然后你的EllVertex 将从其构造函数传递一个EllParams 给父构造函数,这就是私有Vertex.p 的初始化方式。

例如:

class Params {
    virtual Params operator + (Params const& p) = 0;
};

class Vertex {
    public:
        Params operator + (Params const& ap) const {
            return *p + ap
        };

        virtual float eval() = 0;

    protected:
        Vertex(Params* inputParams) : p(inputParams) {}

    private:
        Params* const p;
};

请注意,我已将您的 p 成员变量更改为指针。这样,您不必确保为 Params 或任何子类定义了正确的复制构造函数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-23
    • 2012-12-02
    • 2020-08-18
    • 2020-08-21
    • 1970-01-01
    相关资源
    最近更新 更多