定义一个基类指针,动态开辟时用派生类,两个类都有成员函数sing,当我用基类指针调用sing时,会调用谁的成员sing函数
时间: 2024-03-31 07:38:43 浏览: 80
如果两个类都有成员函数 `sing`,且在基类中这个函数没有被声明为虚函数,那么当使用基类指针调用 `sing` 函数时,会调用基类中的 `sing` 函数,而不会调用派生类中的 `sing` 函数。
这是因为在 C++ 中,非虚函数的调用是根据指针的类型来决定的,而不是根据指针所指对象的类型来决定的。在这种情况下,指针的类型是基类类型,因此调用的是基类中的 `sing` 函数。
如果想要实现动态绑定,可以将 `sing` 函数声明为虚函数,例如在基类中将 `sing` 声明为 `virtual` 类型。这样,当使用基类指针调用 `sing` 函数时,会根据指针所指对象的类型来决定调用哪个类的 `sing` 函数,即调用派生类中的 `sing` 函数。
相关问题
基类定义一个接口,派生类定义的时候将其定义为虚函数接口,用派生类指针调用,走的流程
当基类定义一个接口时,如果希望在派生类中进行实现,可以将该接口定义为虚函数。以下是通过派生类指针调用的流程:
1. 基类定义接口:在基类中定义一个虚函数作为接口。
```cpp
class Base {
public:
virtual void interface() {
// 接口定义
}
};
```
2. 派生类继承并实现接口:派生类继承基类,并对接口进行实现。
```cpp
class Derived : public Base {
public:
void interface() override {
// 实现接口功能
}
};
```
3. 创建派生类对象并调用接口:通过派生类的指针或引用调用接口。
```cpp
int main() {
Base* ptr = new Derived(); // 通过基类指针指向派生类对象
ptr->interface(); // 调用接口,会执行派生类中的实现
delete ptr; // 释放内存
return 0;
}
```
在上述代码中,通过创建基类指针 `ptr` 并将其指向派生类对象 `Derived`,然后通过该指针调用基类的接口函数 `interface()`。由于 `interface()` 是虚函数,所以会根据实际对象类型来动态绑定,最终执行派生类中的实现。
这种机制称为多态,它允许通过基类的指针或引用来调用派生类的实现,实现了接口的统一调用和灵活性。
那么派生类指针和基类指针调用虚函数有什么区别
在C++中,派生类可以继承基类的成员函数,包括虚函数。当基类指针或引用指向派生类对象时,如果该虚函数被声明为虚函数,则可以通过该指针或引用调用虚函数。这种情况下,基类指针或引用调用虚函数时,会根据指向的对象类型来确定调用哪个类的虚函数。
派生类指针和基类指针调用虚函数的区别在于,派生类指针调用虚函数时,会直接调用派生类中的虚函数,而基类指针调用虚函数时,会根据指向的对象类型来确定调用哪个类的虚函数。因此,如果派生类中重写了基类的虚函数,那么通过派生类指针调用虚函数时,会调用派生类中的虚函数;而通过基类指针调用虚函数时,会调用基类中的虚函数。
举个例子,假设有一个基类Animal和一个派生类Dog,它们都有一个虚函数speak()。如果我们用一个Animal指针指向一个Dog对象,那么通过Animal指针调用speak()时,会调用Animal类中的speak()函数;而通过Dog指针调用speak()时,会调用Dog类中的speak()函数。
阅读全文