从具有相同基数的另一个派生类调用派生类的非 const 方法

Calling non-const method of a derived class from another derived class having the same base

本文关键字:派生 调用 const 方法 另一个      更新时间:2023-10-16

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

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

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。

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

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

由于this指针不是Derived1* Derived1也不是其值类型Derived2 的基数。


我想要这个以避免制作包含相同 我已经为第二个派生类编写的代码行。

为什么不将该方法带到基类中?如果你不想(也许是因为它不是所有派生类型的整体属性(,你可以使用一个额外的派生类,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();
    }
};

修改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(),请将该方法设为虚拟并在其中重写它。

注意:阅读有关封装和访问说明符的信息。