我现在正在寻找一种方法来覆盖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的所有访问方式更简单的方法。
有什么方法可以覆盖“成员变量类型”?
谢谢。
答案 0 :(得分:0)
// I want to use the "a" member variables as "MemberDerivedA" types
您的选择:
除了基类存储的内容以外,还将指向MemberDerivedA
对象的指针存储在DerivedA
中。
对基类所持有的指针执行dynamic_cast
。仅在强制转换成功时才使用指针。
重新考虑您的代码,因此您不需要以上任何一个。 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); }
};