创建一个子类影响另一个子类的行为
Creating a subclass to affect the behavior of another subclass
我正在使用的库定义了一个抽象的基类A
,使用〜10个纯虚拟方法。没有公开定义的非PURE方法,我怀疑A
没有私人数据,即类只是一个接口。该库还定义了一些A
的混凝土子类,例如C
。
我想向A
添加一些功能,以便其所有子类继承此功能。但是,库中定义了 A
,我不能这样做。
相反,我定义了一个新的B
子类。该子类不是具体的,并且A
的所有纯虚拟方法都是单独的。它定义了一些新的助手方法,这些方法呼吁A
定义的方法。B
也没有定义的字段。
为了使用B
来增强C
实例的功能,我已经完成了以下操作,我怀疑不能保证行为。
- 在堆上创建类型
C
的对象。 - 将指向此对象的指针铸造为类型
B*
。 - 返回此指针,退出创建对象的本地范围。
-
B
使用此指针在其他范围中定义的呼叫方法。
这是安全的吗?这些对象是在堆上创建的,因此我认为不会发生任何切片。如果安全性取决于A
和C
定义哪些字段,则需要哪些要求保证此行为?
如果A
和C
都没有自己的数据以外的其他数据,这会安全吗?
如果只有C
有自己的数据,那怎么办?
编辑:我应该补充一点,我已经尝试过,并且行为至少似乎是我想要的。我尚未介绍记忆泄漏。
整个过程对我来说看起来像是代码的气味。我将采用包装班的B类的方法:在构造函数中取A*指针,将您需要的调用转发到A*。然后,您可以将C*传递给该构造函数,该构造函数将通过B destructor中的"删除"正确删除。
这是我评论的一个想法。它的行为按预期的是,可能是一些隐藏的危险,但对我而言,只要bar
不容纳任何数据,这似乎是合理的。
#include <iostream>
struct base {
int x = 1;
int y = 2;
void show() {
std::cout << x + y << std::endl;
}
virtual void virt() = 0;
};
struct foo : base {
int a = 5;
int b = 2;
void print() {
std::cout << a + b << std::endl;
x++;
}
void virt() override {
std::cout << "foo" << std::endl;
}
};
template <typename T>
struct bar : T {
void print2() {
std::cout << T::a * T::b << std::endl;
T::b++;
T::x++;
T::virt();
}
};
template <typename Base>
bar<Base>* extend_with_bar(Base& base) {
return static_cast<bar<Base>*>(&base);
}
int main() {
foo f;
f.show();
f.print();
auto b = extend_with_bar(f);
b->print2();
b->print2();
b->print();
f.print();
b->show();
f.show();
b->virt();
}
相关文章:
- 继承期间显示未知行为的子类
- 通过指向指针数组的指针访问子类的属性
- 从父类方法返回子类对象
- c++, 在子类中,如何在没有对象的情况下访问父类的方法?
- 将父类对象强制转换为子类的问题
- 避免在C++中重复子类定义
- 将QOpenGLWidget子类转换为使用Metal而不是OpenGL的子类是否可行?
- 如何初始化矢量的模板化子类
- C++ 继承:将子类传递给需要基类的函数并获取子类行为
- 有没有办法按值将纯抽象类的所有子类传递给 C++ 中的函数?
- 使用子类覆盖基类中定义的函数
- 子类地址等于虚拟基类地址?
- 将子类方法声明为基类的友元
- C++子类共享变量?
- 如何检查模板专用化是否是基本模板的子类?
- 仅让特定类'Fabric'构造类'Foo'及其所有子类的实例
- 使用模板参数重载C++方法:如何使其适用于模板的子类?
- 基类中的默认析构函数禁用子类中的移动构造函数(如果有成员)
- 私有基类通过子类中的模板友元函数和模板方法影响成员访问
- CRTP 继承中的基类"friending"是否也会影响子类?