继承类中的C ++成员变量类型覆盖

时间:2018-08-09 04:48:01

标签: c++ inheritance override

我现在正在寻找一种方法来覆盖C ++继承中的“成员变量类型”。

例如:

class MemberBase
{
    protected:
       char* data;
    public:
       void print_data( void ) { printf("%s\n", data); }
};

class MemberDerivedA : public MemberBase
{
    protected:
       int number;
    public:
       void print_A_data( void ) { printf( "A: %d\n", number); }
};

class MemberDerivedB : public MemberBase
{
    protected:
       double real;
    public:
       void print_B_data( void ) { printf( "B: %lf\n", real); }
};

class Base
{
    protected:
       MemberBase* a;
    public:
       Base( MemberBase* a ) { this->a = a; }
       void use( void ) { a->print_data(); }
};

class DerivedA
{
    public:
         DerivedA( MemberDerivedA* a ) : Base(a) { this->a = a; }

         // I want to use the "a" member variables as "MemberDerivedA" types 
         void use_A( void ) { a->print_A_data(); }

};  

在上面的代码中,我想通过从基类继承的成员变量a在DrivedA类中使用MemberDrivedA类的print_A_data函数。 (当然,DerivedA类中的“指针a”所指向的对象实际上是MemberDrivedA类型的对象)

我当然可以使用指针类型转换来做到这一点。(将“ a” MemberBase *类型转换为DrivedA中的MemberDrivedA *类型)但是,我想找到一种比强制转换a的所有访问方式更简单的方法。

有什么方法可以覆盖“成员变量类型”?

谢谢。

3 个答案:

答案 0 :(得分:0)

  // I want to use the "a" member variables as "MemberDerivedA" types 

您的选择:

  1. 除了基类存储的内容以外,还将指向MemberDerivedA对象的指针存储在DerivedA中。

  2. 对基类所持有的指针执行dynamic_cast。仅在强制转换成功时才使用指针。

  3. 重新考虑您的代码,因此您不需要以上任何一个。 IMO,这是最好的选择。

答案 1 :(得分:0)

如果不欺骗类型系统,绝对没有绝对的方法可以拥有协变变量。

class Base
{
    protected:
       virtual MemberBase* a() = 0;
    public:
       Base( ) = default;
    // whatever
};

处理这种情况的一种方法是改用协变虚拟函数

{{1}}

答案 2 :(得分:0)

如果在print_data类中将base函数虚拟化并在derived class中覆盖它,该怎么办?

class MemberBase
{
    protected:
       char* data;
    public:
       virtual void print_data( void ) { printf("%s\n", data); }
};

class MemberDerivedA : public MemberBase
{
    protected:
       int number;
    public:
       void print_data( void ) { printf( "A: %d\n", number); }
};

class MemberDerivedB : public MemberBase
{
    protected:
       double real;
    public:
       void print_data( void ) { printf( "B: %lf\n", real); }
};