C++中的类型转换和继承
Typecasting and inheritance in C++
我有个问题。有两类:
struct Base {
Base* retain() {
//retain here
return this;
}
};
struct Derived : Base {
};
Derived *d1 = new Derived();
Derived *d2 = d1->retain(); //error here: need to typecast to Derived*
Derived *d3 = (Derived*)d1->retain(); //OK
有没有什么方法可以重写retain()函数,使其不需要手动对结果进行类型转换?换句话说:retain()应该返回派生类型的对象。
template<typename T>
struct Base
{
T* retain()
{
return (T*)this;
}
};
struct Derived : Base<Derived>
{
};
Derived *d1 = new Derived();
Derived *d2 = d1->retain();
或者:
struct Base
{
template<typename T>
void retain(T** ptr)
{
*ptr = (T*)this;
}
};
struct Derived : Base
{
};
Derived *d1 = new Derived;
Derived *d2;
d1->retain(&d2);
通常,当你做你正在做的事情时,基类会有一个虚拟析构函数。这允许运行时类型标识。
您可能还想编写struct Derived : public Base
,包括关键字public
。
关于虚拟析构函数的解释如下。
一个简单类的对象,即缺乏虚拟方法的类,只不过是内存中的数据集合。具有此类对象地址的代码无法仅通过查看对象来判断该对象是基类型还是派生类型。
但是,如果基类型至少有一个虚拟方法,则编译器会向该类型的每个对象添加一个隐藏指针。该指针指向一个表,该表准确地标识了对象的类型,从而使指针上的dynamic_cast<>()
和其他多态操作成为可能。
如果所有这些对您来说都是新的,那么我建议您下一步尝试:向基类添加一个空的虚拟析构函数virtual ~Base() {}
,然后阅读关于dynamic_cast<>()
的内容。接下来,您可能希望使基本retain()
也是虚拟的,然后赋予Derived它自己的,覆盖retain()
。
无论如何,除非你能得到更有针对性的建议,否则前面的内容应该会给你一些开始的东西。祝你好运
相关文章:
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- C++中的双指针类型转换
- 逐位操作的隐式类型转换
- 模板中的类型转换
- 在 C++(和 C)中进行类型转换时明显不一致
- 字符类型转换不兼容
- 将复杂的非基元C++数据类型转换为 Erlang/Elixir 格式,以使用 NIF 导出方法
- C++:用户定义的显式类型转换函数错误
- 事件系统:使用类型转换或联合进行继承
- 继承和隐式类型转换
- 继承结构的类型转换导致g++编译错误
- 继承类型的指针之间的静态强制转换
- QObject基类到继承对象的C++类型转换
- 为什么显式类型转换允许对私有继承进行向上转换
- C++中的类型转换和继承
- 多重继承c++,如何进行类型转换
- 多重继承和强制类型转换
- 为什么类型转换运算符不适用于继承的类?
- 基于继承的c++强制类型转换