微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

覆盖C中的成员变量

我在某些C代码中遇到了一个棘手的问题,最容易用代码描述.我的课程类似于:
class MyVarBase
{
}

class MyVar : public MyVarBase
{
    int Foo();
}

class MyBase
{
public: 
    MyBase(MyVarBase* v) : m_var(v) {}
    virtual MyVarBase* Getvar() { return m_var; }
private:
    MyVarBase* m_var;
}

我还有一个MyBase的子类需要有一个MyVar类型的成员,因为它需要调用Foo.将Foo函数移动到MyVarBase不是一种选择.这样做是否有意义:

class MyClass : public MyBase
{
public:
    MyClass(MyVar* v) : MyBase(v),m_var(v) {}
    MyVar* Getvar() { return m_var; }
private:
    MyVar* m_var;
}

这似乎工作,但看起来非常糟糕,我不确定它是否会导致内存泄漏或打破复制构造函数.我的其他选择可能是在MyClass中将MyVar变量命名为其他东西,但是它等于基础中的m_var指针,或者在MyVar类型上对MyBase进行临时处理.

所有这些选项似乎并不理想,所以我想知道是否有其他人遇到过这样的情况,以及是否有一个很好的方法让它工作.

解决方法

执行此操作的正确方法是仅在基类中使用变量.由于派生类知道它必须是动态类型MyVar,这是完全合理的:
class MyClass : public MyBase
{
public:
    MyClass(MyVar* v) : MyBase(v) {}
    MyVar* Getvar() { return static_cast<MyVar*>(MyBase::Getvar()); }
}

由于MyVar派生自MyVarBase,因此如果Getvar是虚拟的,则Getvar的不同返回类型仍然有效(如此处所示).请注意,使用该方法,MyBase中必须没有可以将指针重置为不同的函数.

请注意,在这种情况下,static_cast是正确的强制转换.使用一个评论者提出的dynamic_cast,将告诉Getvar的读者和用户,MyBase :: Getvar()可以返回指向不是MyVar类型的对象的指针.但这并不能反映我们的意图,因为您只能通过MyVar.结果是软件开发中最重要的事情.你可以做的是断言它是非空的.它将在运行时中止,并在项目的调试版本中显示错误消息:

MyVar* Getvar() { 
    assert(dynamic_cast<MyVar*>(MyBase::Getvar()) != 0);
    return static_cast<MyVar*>(MyBase::Getvar()); 
}

原文地址:https://www.jb51.cc/c/117329.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐