class Base { public: void Fun() { std::cout << " Call Base Fun " << std::endl; } }; class Derived : public Base { public: void Fun() { std::cout << " Call Derived Fun " << std::endl; } }; Derived* d = new Derived(); Base* b = d; d->Fun(); b->Fun();
时间: 2024-04-21 16:23:13 浏览: 96
这段代码定义了一个基类 `Base` 和一个派生类 `Derived`。`Derived` 类是从 `Base` 类继承而来的。
在代码的最后,创建了一个 `Derived` 类的对象 `d`,并将其指针赋值给了一个 `Base` 类的指针 `b`。接着,通过指针调用了对象的成员函数 `Fun()`。
由于 `Fun()` 函数在基类和派生类中都有定义,且被声明为虚函数,因此会发生动态绑定(dynamic binding),即根据指针所指对象的实际类型来确定调用哪个版本的函数。
输出结果为:
```
Call Derived Fun
Call Base Fun
```
解释如下:
- `d->Fun()`:由于 `d` 是一个 `Derived` 类型的指针,因此调用的是 `Derived` 类中的 `Fun()` 函数。所以输出为 "Call Derived Fun"。
- `b->Fun()`:尽管 `b` 是一个 `Base` 类型的指针,但它指向的实际是一个 `Derived` 类型的对象。因此同样会调用 `Derived` 类中的 `Fun()` 函数。所以输出为 "Call Derived Fun"。
这就是多态性(polymorphism)的特性之一,通过使用虚函数和基类指针,可以实现对派生类中的同名函数进行动态调用。
相关问题
#include <iostream> using namespace std; class A { private: int nVal; public: void Fun(){ cout << "A::Fun"<<endl;} void Do(){ cout << "A::Do"<<endl;} }; class B:public A{ public: virtual void Do(){ cout << "B::Do"<<endl;} }; class C:public B { public: void Do(){ cout << "C::Do"<<endl;} void Fun() { cout << "C::Fun"<<endl;} }; void Call( ){ p->Fun(); p->Do(); } int main(){ Call(new A()); ; return 0; }
这段代码存在一些问题,无法通过编译。主要问题如下:
1. `Call` 函数中使用了指针 `p`,但没有对其进行声明或初始化,会导致编译错误。可以将其声明为基类 A 的指针,如下所示:
```cpp
void Call(A* p){
p->Fun();
p->Do();
}
```
2. `Call` 函数中调用了函数 `p->Do()`,由于 `Do` 函数被声明为虚函数,因此会根据指针所指向的对象类型来动态绑定对应的函数。但是,在本例中,由于 `Call` 函数的参数类型为 `A*`,因此无论传递的是 `A`、`B` 还是 `C` 类型的对象,都将调用基类 `A` 中的 `Do` 函数,而不是子类 `B` 或 `C` 中的函数。可以将参数类型改为 `B*` 或 `C*`,这样就能够正确地调用对应的函数,如下所示:
```cpp
void Call(B* p){
p->Fun();
p->Do();
}
```
3. 在 `main` 函数中,调用了 `Call` 函数,并传递了一个 `A` 类型的对象指针。由于 `A` 类型没有继承关系,因此无法将其转换为 `B` 或 `C` 类型的指针。可以将其改为传递一个 `B` 或 `C` 类型的对象指针,例如:
```cpp
Call(new B());
Call(new C());
```
修改后的代码如下所示:
```cpp
#include <iostream>
using namespace std;
class A {
private:
int nVal;
public:
void Fun(){ cout << "A::Fun" << endl; }
void Do(){ cout << "A::Do" << endl; }
};
class B:public A {
public:
virtual void Do(){ cout << "B::Do" << endl; }
};
class C:public B {
public:
void Do(){ cout << "C::Do" << endl; }
void Fun(){ cout << "C::Fun" << endl; }
};
void Call(B* p){
p->Fun();
p->Do();
}
int main(){
Call(new B());
Call(new C());
return 0;
}
```
输出结果为:
```
A::Fun
B::Do
A::Fun
C::Do
```
帮我逐句翻译下面的代码#include <iostream> class Base { public: void work1() { std::cout << "This is work1() of Base." << std::endl; } void work2() { std::cout << "This is work2() of Base." << std::endl; } }; class Derived : private Base { public: void callWork1() { work1(); } }; int main() { Derived d; d.callWork1(); return 0; }
好的,下面是代码的逐句翻译:
```
#include <iostream>
```
这是一个预处理指令,它在程序开始执行之前包含了iostream库,以便我们可以使用cout和endl等输出函数。
```
class Base {
public:
```
这里定义了一个类Base,它是一个公共类,可以被其他类或函数调用。
```
void work1() {
std::cout << "This is work1() of Base." << std::endl;
}
```
这是一个公共成员函数work1,它输出一段字符串并换行。
```
void work2() {
std::cout << "This is work2() of Base." << std::endl;
}
```
这是另一个公共成员函数work2,它也输出一段字符串并换行。
```
};
```
这个类的定义结束。
```
class Derived : private Base {
public:
```
这里定义了一个类Derived,它是一个私有类,继承自Base类。
```
void callWork1() {
work1();
}
```
这是一个公共成员函数callWork1,它调用了Base类中的公共成员函数work1。
```
};
```
这个类的定义结束。
```
int main() {
Derived d;
d.callWork1();
return 0;
}
```
这是程序的主函数,它创建了一个Derived类的对象d,并调用了它的公共成员函数callWork1。这个函数会调用Base类的公共成员函数work1,输出一段字符串并换行。最后,程序返回0,表示程序执行成功。
阅读全文