gpt4 book ai didi

c++ - 从具有相同基类的另一个派生类调用派生类的非常量方法

转载 作者:搜寻专家 更新时间:2023-10-31 02:11:16 24 4
gpt4 key购买 nike

我有一些基类和两个派生自它的类。我想为第一个派生类编写一个方法,通过调用第二个派生类的现有方法来修改对象的内部数据。我想要这样做是为了避免创建一个包含我已经为第二个派生类编写的相同代码行的方法。

有没有安全的方法来做这样的事情?目前,我这样做的方式是这样的:

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。这会修改对象的私有(private)变量 data,即使我们调用了另一个派生类的方法也是如此。

代码似乎可以工作,但我在这里感觉不安全,特别是因为带有 dynamic_cast 的版本会导致段错误。感谢您的任何建议!

更新:我在 Linux 中使用 GCC。

最佳答案

您使用此代码调用了未定义的行为:

void ModifyData2()
{
(static_cast<Derived1 *>(this))->ModifyData1();
}

因为 this 指针不是 Derived1* 也不是 Derived1 其值类型的基础,Derived2.


I want this in order to avoid making a method containing the same lines of code that I've already written for the second derived class.

为什么不把那个方法带到基类中呢?如果您不想(可能因为它不是所有派生类型的整体属性),您可以使用一个额外的派生类,Derived1Derived2 都将继承自该派生类。


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();
}
};

关于c++ - 从具有相同基类的另一个派生类调用派生类的非常量方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43879036/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com