父类的指针指向子类c++
时间: 2024-05-20 16:08:36 浏览: 120
在C++中,父类的指针可以指向子类的对象。这是因为子类继承了父类的所有成员,包括数据成员和成员函数,因此子类的对象在内存中布局与父类的对象相同。
下面是一个简单的例子,展示了如何使用父类的指针指向子类的对象:
```
class Parent {
public:
void foo() {
cout << "Parent::foo()" << endl;
}
};
class Child : public Parent {
public:
void foo() {
cout << "Child::foo()" << endl;
}
};
int main() {
Child child;
Parent* parentPtr = &child; // 父类指针指向子类对象
parentPtr->foo(); // 调用的是子类中的 foo() 函数
return 0;
}
```
在上面的例子中,我们定义了一个 Parent 类和一个 Child 类,Child 类继承自 Parent 类。我们创建了一个 Child 类的对象 child,并使用一个 Parent 类的指针 parentPtr 指向该对象。我们调用 parentPtr->foo() 时,实际上会调用 Child 类中重载了 Parent 类中的 foo() 函数。
相关问题
虚函数 父类指针指向子类
虚函数是一种特殊类型的成员函数,在C++中,当我们在父类的指针或引用上声明它为虚函数时,即使该指针实际上指向的是子类的对象,调用这个函数时会根据实际对象的类型动态地调用子类的实现。这种机制实现了动态绑定,也称为晚期绑定或运行时多态。
举个例子:
```cpp
class Base {
public:
virtual void display() { // 虚函数声明
cout << "Base class" << endl;
}
};
class Derived : public Base {
public:
void display() override { // 子类重写虚函数
cout << "Derived class" << endl;
}
};
int main() {
Base* basePtr = new Derived(); // 父类指针指向子类对象
basePtr->display(); // 运行时调用Derived的display()
delete basePtr; // 删除对象
return 0;
}
```
在这个例子中,虽然`basePtr`是一个`Base`类型的指针,但我们通过它调用`display()`时,实际上是调用了`Derived`类的版本,这就是虚函数在父类指针下工作的原理。
C++中。父类指针指向子类与子类指针指向父类有什么区别?
父类指针指向子类对象和子类指针指向父类对象在C++中有以下区别:
1. 父类指针指向子类对象:
- 在继承关系下,父类的指针可以直接指向子类对象,无需进行强制类型转换。
- 通过父类指针调用的成员函数将会调用子类中的同名函数(如果存在),实现了多态性。
- 父类指针无法访问子类中新增的成员函数和成员变量。
2. 子类指针指向父类对象:
- 在继承关系下,子类的指针不能直接指向父类对象,会导致编译错误。
- 子类指针只能访问父类中的成员函数和成员变量,无法访问子类中新增的成员函数和成员变量。
- 如果通过子类指针调用的成员函数在父类中被重写,将会调用父类中的同名函数,而不是子类中的函数。
总结起来,父类指针指向子类对象可以实现多态性,而子类指针指向父类对象则无法实现多态性,并且存在类型不匹配的问题。
阅读全文