声明一个基类BaseClass,从它派生出类DerivedClass。 (1)基类BaseClass有成员函数fn1()和fn2(),fn1()是虚函数。 (2)派生类DerivedClass也有成员函数fn1()和fn2()。 (3)在main()主函数中声明一个DeriveClass的对象,分别用BaseClass和DerivedClass类型的指针指向该DerivedClass的对象,并通过指针调用fn1()和fn2(),编译程序并观察运行结果,解释程序执行原理。
时间: 2024-02-16 08:00:21 浏览: 67
基类和派生类 面向对象程序设计 C++ 实验报告
好的,我会记录下您的问题并回答。以下是代码示例:
```c++
#include <iostream>
using namespace std;
class BaseClass {
public:
virtual void fn1() {
cout << "BaseClass fn1 called." << endl;
}
void fn2() {
cout << "BaseClass fn2 called." << endl;
}
};
class DerivedClass : public BaseClass {
public:
void fn1() {
cout << "DerivedClass fn1 called." << endl;
}
void fn2() {
cout << "DerivedClass fn2 called." << endl;
}
};
int main() {
DerivedClass obj;
BaseClass* ptr1 = &obj;
DerivedClass* ptr2 = &obj;
ptr1->fn1(); // 调用 DerivedClass::fn1(),因为 fn1() 是虚函数
ptr1->fn2(); // 调用 BaseClass::fn2(),因为 fn2() 不是虚函数
ptr2->fn1(); // 调用 DerivedClass::fn1()
ptr2->fn2(); // 调用 DerivedClass::fn2()
return 0;
}
```
在这个示例中,我们定义了一个基类 `BaseClass` 和一个派生类 `DerivedClass`。在 `BaseClass` 中定义了一个虚函数 `fn1()` 和一个非虚函数 `fn2()`,在 `DerivedClass` 中重写了 `fn1()` 和 `fn2()`。在 `main()` 中创建了一个 `DerivedClass` 对象,并使用 `BaseClass` 和 `DerivedClass` 类型的指针指向该对象,并通过指针调用了 `fn1()` 和 `fn2()`。
由于 `fn1()` 是虚函数,在 `BaseClass` 和 `DerivedClass` 中都有定义,因此在调用时会根据指针指向的对象的实际类型来决定调用哪个版本的 `fn1()`。当指针为 `BaseClass*` 类型时,调用的是 `DerivedClass` 中重写后的 `fn1()`;当指针为 `DerivedClass*` 类型时,调用的也是 `DerivedClass` 中重写后的 `fn1()`。
而 `fn2()` 不是虚函数,无论指针的类型是什么,都会调用指向的类型中定义的版本。当指针为 `BaseClass*` 类型时,调用的是 `BaseClass` 中定义的 `fn2()`;当指针为 `DerivedClass*` 类型时,调用的是 `DerivedClass` 中定义的 `fn2()`。
因此,C++ 中的多态需要使用虚函数来实现,只有将基类的函数声明为虚函数,才能正确地调用派生类中的函数。
阅读全文