继承类中的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 ++成员变量类型覆盖的主要内容,如果未能解决你的问题,请参考以下文章