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

Posted

技术标签:

【中文标题】继承类中的c ++成员变量类型覆盖【英文标题】:c++ member variable type overriding in inheritance class 【发布时间】:2018-08-09 04:48:00 【问题描述】:

我现在正在寻找一种方法来覆盖 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(); 

;  

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

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

有没有办法覆盖“成员变量类型”?

提前致谢。

【问题讨论】:

【参考方案1】:
  // I want to use the "a" member variables as "MemberDerivedA" types 

你的选择:

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

    对基类持有的指针执行dynamic_cast。仅当转换成功时才使用指针。

    重新考虑您的代码,这样您就不需要上述任何一种。 IMO,这是最好的选择。

【讨论】:

感谢您的回答。我尝试了 1 但放弃了,因为有时我在基类中访问成员变量“a”。第二种解决方案是很好的解决方案。但正如我之前所说,我想知道是否还有其他方法。谢谢。 @WON,我想不出第四个选择。【参考方案2】:

绝对没有办法在不欺骗类型系统的情况下拥有协变变量。

class Base

    protected:
       virtual MemberBase* a; // imaginary syntax
    public:
       Base( MemberBase* a )  this->a = a; 
   void use( void )  a = new MemberDerivedA;  // oops we just broke MemberDerivedB
;

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

class Base

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

【讨论】:

【参考方案3】:

如果您在base 类中将print_data 函数设为虚拟并在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); 
;

【讨论】:

感谢您的回答。但是,有时我应该在 Base 类中调用 print_data(),而在 DerivedA 类中调用 print_data() 和 print_A_data()。

以上是关于继承类中的c ++成员变量类型覆盖的主要内容,如果未能解决你的问题,请参考以下文章

子类能不能继承父类的成员变量

继承与组合

Java 子类继承父类成员中的问题

Java继承

Java继承内存分配

java基础疑难点总结之成员变量的继承,方法重载与重写的区别,多态与动态绑定