我有一些基类和两个派生自它的类。我想为第一个派生类编写一个方法,通过调用第二个派生类的现有方法来修改对象的内部数据。我想要这个,以避免使一个方法包含我已经为第二个派生类编写的相同代码行。
有没有安全的方法来做这样的事情? 目前,我这样做是这样的:
class Base
{
protected:
int data;
// some public methods
};
class Derived1: public Base
{
private:
void ModifyData1() { data = 1; }
// some public methods
friend class Derived2;
};
class Derived2: public Base
{
public:
void ModifyData2()
{
(static_cast<Derived1 *>((Base*)this))->Derived1::ModifyData1();
}
};
所以我理解它的方式,指针this
被隐式转换为基指针(向上转换),然后static_cast
在那个上执行,向下转换为类Derived1
。这会修改对象的私有变量data
,即使我们调用了另一个派生类的方法。
代码似乎有效,但我在这里感觉不安全,特别是因为带有dynamic_cast
的版本会导致分段错误。谢谢你的建议!
更新:我在Linux中使用GCC。
答案 0 :(得分:2)
您使用以下代码调用了未定义的行为:
void ModifyData2()
{
(static_cast<Derived1 *>(this))->ModifyData1();
}
因为this
指针不是Derived1*
,Derived1
也不是其值类型Derived2
的基础。
我想要这样做以避免制作包含相同方法的方法 我已经为第二个派生类编写的代码行。
为什么不将该方法用于基类?如果您不想(可能因为它不是所有派生类型的整体属性),您可以使用Derived1
和Derived2
将继承的额外派生类。
class Base
{
protected:
int data;
// some public methods
};
class DerivedModifier : Base
{
protected:
virtual void ModifyData() { data = 1; }
};
class Derived1: public DerivedModifier
{
private:
void ModifyData1(){
DerivedModifier::ModifyData();
}
};
class Derived2: public DerivedModifier
{
public:
void ModifyData2(){
DerivedModifier::ModifyData();
}
};
答案 1 :(得分:0)
修改data
的方法应与data
放在同一个类中。父类持有data
,它也应该保留modifyData()
。
class Base {
public:
void modifYData() { data = 1}
// some other public methods
private:
int data;
};
您将能够执行以下操作:
Base b;
Derived1 d1;
Derived2 d2;
b.modifyData();
d1.modifyData();
d2.modifyData();
如果希望派生类在调用modifyDtata()
时表现不同,请将方法设为虚拟并在其中覆盖它。
N.B:了解encapsulation和access specifiers。