从具有相同基数的另一个派生类调用派生类的非 const 方法
Calling non-const method of a derived class from another derived class having the same base
>我有一些基类和两个派生的类。我想为第一个派生类编写一个方法,该方法通过调用第二个派生类的现有方法来修改对象的内部数据。我希望这样做是为了避免创建一个包含我已经为第二个派生类编写的相同代码行的方法。
有没有安全的方法可以做这样的事情?目前,我的做法是这样的:
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
的基数。
我想要这个以避免制作包含相同 我已经为第二个派生类编写的代码行。
为什么不将该方法带到基类中?如果你不想(也许是因为它不是所有派生类型的整体属性(,你可以使用一个额外的派生类,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();
}
};
修改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()
,请将该方法设为虚拟并在其中重写它。
注意:阅读有关封装和访问说明符的信息。
相关文章:
- 为什么使用 "this" 指针调用派生成员函数?
- 绑定派生类方法C++从实例范围之外的分隔 std::function 变量调用
- 使用 std::variant<...时调用 BaseState 函数而不是派生函数>
- QWidget::p aintEngine:不应再在 QTreeWidget 派生类中调用
- 调用从模板派生的类的静态方法,而不指定模板
- 调用派生类成员函数
- 从基类实例调用派生类方法而不进行强制转换
- 派生类调用父类的方法,该方法调用重写的虚拟方法调用错误的方法
- 从 c++ 中派生类的析构函数调用虚函数
- 从基类 (C++) 调用派生类中的非虚函数
- 调用不在基类中的派生类函数而不进行动态强制转换,以最大程度地提高性能
- 在将派生类指针类型转换为派生类指针后,从基类指针调用派生类函数
- 如何从 Gtk::窗口调用派生对象的析构函数
- 在dynamic_pointer_cast后调用派生类的构造函数
- 如何使派生类函数在调用时始终调用相同的基类函数?
- C++初始化之前派生类调用基类的方法
- 为什么派生类的实例从基类调用方法?
- 从 Base 引用对象调用派生类的成员
- 使用回调函数从构造函数调用虚拟/派生方法的替代方法?
- 基函数中的公共函数,当使用派生对象通过另一个基函数调用时,派生调用基函数