基类指针不能分配给派生类指针的原因
The reason why baseclass pointer cannot be assigned to derived class pointer
谁能解释为什么基类指针不能分配给派生类指针?我知道这是不可能的,但我想知道逻辑派生类包含基类的原因。让我知道原因提前致谢
考虑:
struct A
{
};
struct B : A
{
int b;
};
struct c : A
{
char c;
};
C cobj;
A* aptr = &cobj;
B* bptr = aptr; // Assuming this were allowed...
bptr->b = 10;
通过这样做,您将使用超出有效范围的内存。您已经创建了一个大小为 sizeof(C)
的对象,但您并没有将其视为大小为 sizeof(B)
的对象。
派
生类除了基类中的所有数据成员和成员函数之外,还可以有自己的数据成员和成员函数。
如果将派生类指针指向与基类指针相同的内容,则派生类指针将认为它指向派生类对象,即使它指向基类对象也是如此。
如果尝试使用此派生类指针访问派生类数据成员或成员函数,它将不起作用,因为它指向不具有这些功能的基类对象。
例如,假设我有一个名为 Person 的基类和一个名为 Programmer 的派生类。 我可以创建一个 Person 对象,并有一个指向该对象的指针。 然后,我可以尝试使程序员指针也指向该 Person 对象(通过将其设置为等于 Person 指针(。 如果我使用程序员指针尝试使 Person 对象代码(相当于调用 Programmer 成员函数(或执行只有程序员才能执行的操作,则它不起作用,因为 Person 尚未专业化。
我想你的问题是为什么不应该做以下事情:-
Derived *ptr = new Base; //assume for now public inheritance.
Derived
是Base
的专业化,即Derived
将继承base
的所有功能,并且还可以添加一些自己的功能。这意味着分配Base to Derived ptr
会导致这些功能丢失,如果调用该变量/方法,可能会导致未定义的行为。
相关文章:
- 为什么使用 "this" 指针调用派生成员函数?
- 如何使用基类指针引用派生类成员
- 使用基类指针创建对象时,缺少派生类析构函数
- 有没有一种"cleaner"的方法可以在指向基的指针向量中找到派生类的第一个实例?
- 如果基类包含双指针成员,则派生类的构造函数
- 如何在不使用指针的情况下将派生类的对象作为参数传递给基类中的函数?
- 如何在工厂方法中返回指向基于基础操作系统的派生类的有效指针
- 指向基类派生类的 std::unique_ptr 的指针
- 当我在 C++ 中将派生类的指针分配给指针时,地址会更改
- 从基指针到派生的强制转换问题
- 派生类是从基类继承 v 指针并仅使用它,还是也有自己的 v 指针?
- 从纯虚拟类 (A) 派生的指针无法访问来自纯类 (B) 的重载方法
- 如何模板化堆栈分配的多态指针数组到接口,包括派生类型的相应点?
- 从基类指针派生派生类的模板类型
- 指向从指针派生类成员函数的指针,指向基类成员函数
- 访问通过指针派生的类
- 如果未使用虚拟函数,则使用基类指针派生类的任何目的
- 从基指针C++派生类的类型
- 无法从指针派生类转换为指针基类(多态性)
- C++ - 传递智能指针派生类