派生的类指针使用static_cast指向基类对象
Derived Class Pointer Pointing To Base Class Object Using Static_Cast
i具有以下代码,其中我具有基类和派生类。基类和派生类都有一个函数成员共享相同名称。在Main()中,我已将基类对象输入到派生的类指针中,并试图调用该函数。令我惊讶的是,它称为派生的类功能成员。据我所知,基类对象不会有有关派生类对象的任何信息。那么,我的派生类指针如何仍然能够访问派生的成员函数?
在升级的情况下,我确实知道派生的类对象将具有基类的内容,这就是为什么指向派生类对象的基类指针会按预期工作。
有人可以帮助我理解即使我有一个指向基类对象的派生类指针(没有派生类信息)的派生类成员函数即使是如何调用的?
#include<iostream>
using namespace std;
class base
{
public:
void b()
{
cout << "base";
}
};
class derived:public base
{
public:
void b()
{
cout << "derived";
}
};
int main()
{
base b;
derived * d1;
d1 =static_cast<derived*>(&b);
d1->b();
return 0;
}
在您的特定情况下,B被称为B>。
。您有一个指向派生类的指针,b不是虚拟的。因此,编译器将生成派生的调用:: B方法。
现在,当您将b放在该指针中时,它是未定义的行为。但是就您而言,由于您不访问该指针,所以没有问题。
将基类施放到派生的类结果不确定的行为
,据我所知,该函数在内存中没有任何额外的空间,它像普通函数一样存储。您可以将成员函数视为正常函数,并具有额外的指针。通常,要调用的函数由对象指针的类型确定。但是虚拟函数是不同的,它通过虚拟函数表称为代码中,没有声明虚拟函数。因此没有虚拟功能表。
您可以以不同的方式看到您的代码:
void derived_b(derived* this)
{
cout << "derived";
}
void base_b(base* this)
{
cout << "base";
}
int main()
{
base b;
derived * d1;
d1 =static_cast<derived*>(&b);
derived_b(d1);
return 0;
}
如果您在课堂中定义了某些成员并将其在函数B中使用,则可能会导致一些错误。例如
class base
{
public:
void b()
{
cout << "base";
}
};
class derived:public base
{
int a;
public:
derived(){a = 1;}
void b()
{
cout << "derived" << a;
}
};
您在main()中的代码可能会导致错误,因为对象B在内存中没有任何成员。
相关文章:
- std::具有相同基类的类的变体
- 是否可以初始化不可复制类型的成员变量(或基类)
- 在C++中,是否可以基于给定的标识符创建基类的新实例,反之亦然
- 基类中的函数名称解析
- C++初始化基类
- 如何通过派生类函数更改基类中的向量
- 如何定义一个纯抽象基类
- 如何使用基类指针引用派生类成员
- 继承:构造函数,初始化C++11中基类的类C数组成员
- 使用基类指针创建对象时,缺少派生类析构函数
- 如何引用基类的派生类?
- 如果基类包含双指针成员,则派生类的构造函数
- 在模板基类中为继承类中的可选重写生成虚拟方法
- 为什么此派生对象无法访问基类的后递减方法?
- 公开最直接的基类模板名称
- 当基类是依赖类型时,这是一个缺陷吗
- 如何使基类的运算符对基类的可变参数数可见(请参阅下面的代码)?
- 模板基类中的静态变量
- C++ 继承:将子类传递给需要基类的函数并获取子类行为
- 使用派生到基类的 boost 序列化"unregistered void cast"