如果公有派生,则可以用基类对象的地址赋值给派生类的指针
时间: 2024-02-11 16:07:47 浏览: 51
如果是公有派生,则可以将基类对象的地址赋值给派生类的指针。这是因为在公有派生中,派生类包含基类的所有成员,因此可以将基类指针隐式地转换为派生类指针。这种转换被称为向上转型。例如,假设有一个基类 `Animal` 和一个公有派生类 `Dog`,则可以将 `Animal` 对象的地址赋值给 `Dog` 指针,如下所示:
```
Animal* animal = new Dog();
```
这里,`new Dog()` 创建了一个 `Dog` 对象,并返回该对象的地址,该地址被隐式转换为 `Animal*` 类型,然后赋值给 `animal` 指针。在 `animal` 指针上调用的任何虚函数都将调用 `Dog` 类中的实现,因为 `Dog` 是 `Animal` 的公有派生类。
相关问题
如果公有派生,则可以用基类对象的地址赋值给派生类的指针。举个代码解释一下
当我们对一个派生类对象进行赋值时,可以使用基类对象的地址来进行赋值,这是因为派生类包含了基类的所有成员,包括成员变量和成员函数,因此可以看作是基类对象的一种扩展。
下面是一个简单的代码示例:
```c++
#include <iostream>
using namespace std;
class Base {
public:
int x;
void show() {
cout << "This is Base class" << endl;
}
};
class Derived : public Base {
public:
int y;
void display() {
cout << "This is Derived class" << endl;
}
};
int main() {
Base b;
Derived d;
// 基类对象的地址赋值给派生类指针
Base *bp = &d;
bp->x = 10;
// 可以访问基类的成员函数
bp->show();
// 无法访问派生类的成员变量和成员函数
// bp->y = 20;
// bp->display();
return 0;
}
```
在上面的代码中,我们定义了一个基类 `Base` 和一个派生类 `Derived`,并且 `Derived` 类公有地继承自 `Base` 类。在 `main` 函数中,我们创建了一个基类对象 `b` 和一个派生类对象 `d`,然后使用基类对象的地址 `&d` 来初始化了一个指向基类的指针 `bp`。
在后面的代码中,我们可以使用指针 `bp` 来访问基类的成员变量 `x` 和成员函数 `show()`,但是无法访问派生类的成员变量 `y` 和成员函数 `display()`。这是因为指针 `bp` 只能访问基类的成员,而不能访问派生类的独有成员。
这里为什么不是派生类对象对象的地址赋值给基类的指针
实际上,将派生类对象的地址赋值给基类指针也是可以的,这也是向上转型的一种形式。例如,假设有一个 `Dog` 对象,可以将其地址赋值给一个 `Animal` 指针,如下所示:
```
Dog* dog = new Dog();
Animal* animal = dog;
```
在这里,`dog` 指针指向一个 `Dog` 对象,然后将其地址赋值给 `animal` 指针,这是合法的,因为 `Dog` 是 `Animal` 的公有派生类。这种转换被称为向上转型,因为它将一个派生类指针转换为一个基类指针。
需要注意的是,如果在向上转型之后使用基类指针调用虚函数,将调用基类中的实现,而不是派生类中的实现。如果想要调用派生类中的实现,需要使用动态绑定技术,即将虚函数声明为虚函数,并在派生类中覆盖该函数。