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

标签 c++ inheritance casting

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

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

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/

相关文章:

c++ - 继承和派生属性在 C++ 中消失

Python 类变量和继承

c++ - C和C++中将int值转换为char指针的区别

c++ - 需要 1 个千兆 NIC 卡的精确带宽公式

c++ - 删除 QListView 中的选定项目列表

c++ - 虚函数和模板冲突

java - 转换为 Type in java

c++ - 删除指针 vector

c++ - 派生模板类访问基类成员数据

c - 不确定如何将 C 中函数的参数转换为 void *