这里pa可以指向new c吗?
时间: 2023-12-13 21:05:42 浏览: 19
可以。假设有如下代码:
```
C* pc = new C;
A* pa = pc;
```
在这里,首先我们创建了一个 C 类型的对象 pc,然后将其地址赋值给了 A 类型的指针 pa。由于 C 类型是从 A 类型派生而来的,因此 C 类型的对象可以被视为 A 类型的对象。这种类型的转换被称为向上转型(upcasting),它是安全的,不需要进行强制类型转换。
因此,如果你想要使用二义基类指针指向派生类对象,可以先创建一个派生类对象,然后将其地址赋值给基类指针。
相关问题
上述的pa可以直接指向new C吗?
是的,pa指针可以指向new出来的C类对象。在C++中,派生类对象包含了所有基类对象的成员和方法,因此可以将一个基类指针指向一个派生类对象。在这种情况下,基类指针可以访问派生类对象的公共成员和方法,但是不能访问派生类对象独有的成员和方法。
例如,在上面的代码中,pa指针是一个A类的指针,但是可以指向new出来的C类对象,因为C类是从A类继承而来的。当然,如果要访问C类对象独有的成员和方法,就需要使用C类的指针或引用来访问。
需要注意的是,在将基类指针指向派生类对象时,如果基类中有虚函数,那么基类指针调用虚函数时会调用派生类中的实现。这就是C++中多态的体现。
class A { public: virtual void foo() {} }; class B { public: virtual void foo() {} }; class C : public A, public B { public: void foo() {} }; int main() { C c; A* pa = &c; B* pb = &c; pa->A::foo(); // 调用 A::foo() pb->B::foo(); // 调用 B::foo() return 0; }这里pa可以直接指向new C吗?
是的,在这个例子中,pa指针可以指向new出来的C类对象。因为C类是从A类继承而来的,所以C类对象也可以被视为A类对象,因此A类指针可以指向C类对象。
在这个例子中,pa指向C类对象后,pa->A::foo()调用了A类的foo()函数,而pb->B::foo()调用了B类的foo()函数。需要注意的是,C类中也有一个foo()函数,但是由于它覆盖了A类和B类的foo()函数,所以在这里不会被调用。
总之,在C++中,派生类对象包含了所有基类对象的成员和方法,因此可以将一个基类指针指向一个派生类对象。此时,基类指针可以访问派生类对象的公共成员和方法,但是不能访问派生类对象独有的成员和方法。同时,如果基类中有虚函数,那么基类指针调用虚函数时会调用派生类中的实现,这就是C++中多态的体现。
相关推荐
![doc](https://img-home.csdnimg.cn/images/20210720083327.png)
![doc](https://img-home.csdnimg.cn/images/20210720083327.png)
![doc](https://img-home.csdnimg.cn/images/20210720083327.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)