1. 多态,输出(考虑析构函数 ) #include<iostream> using namespace std; class A { public: A() { cout<< "A"; } virtual ~A() { cout<< "B"; } void fun() { prt(); } virtual void prt() { cout<< "C"; } }; class B:public A { public: B() { cout<<"D"; } ~B() { cout<<"E"; } void prt() { cout<< "F"; } }; int main( ) { A a,*p1; B b; p1=&a; p1->fun(); p1=&b; p1->fun(); }
时间: 2024-02-10 13:32:29 浏览: 21
这段代码涉及到了虚函数和多态的知识点,其输出结果为:ACBDFCFBE。
首先,我们分别创建了一个A对象和一个B对象,其中A对象的指针p1指向了a,而B对象的指针p1指向了b。然后我们通过p1指针调用了A类中的`fun()`函数,输出了AC,这是因为`fun()`函数中调用了`prt()`函数,由于`prt()`函数是虚函数,所以会在运行时根据对象的实际类型调用对应的函数,因此输出了C。
接着,我们又通过p1指针调用了B类中的`fun()`函数,输出了BDFCFBE。这是因为B类中的`fun()`函数会调用B类中的`prt()`函数,输出了F。同时,当我们退出程序时,会先调用B类的析构函数,输出了E,然后调用A类的析构函数,输出了B。
因此,最终的输出结果为ACBDFCFBE。
相关问题
#include <iostream> using namespace std; class B { public: B(int a) { cout << a << endl; } virtual void f() = 0; virtual void f1(int a) { cout << a; } virtual void f2(int a){ cout << a; } void f3(int c){ cout << c; } void f4(int b) { cout << b; } }; class D :public B { public: void f1(int b)override { cout << b; } void f2(int b)override { cout << b; } void f3(int b) { cout << b; } void g1(char b) { cout << b; } }; void main() { D * d1; }
这段代码存在一些问题:
1. 在类B中定义了纯虚函数f(),但没有提供实现,导致无法实例化该类。
2. 在类D中,对虚函数f1()和f2()进行了override,但没有对纯虚函数f()进行实现,也没有使用override关键字进行修饰。
3. 在类D中新增了非虚函数g1(),但没有在类B中声明或定义,导致无法通过基类指针或引用调用该函数。
4. 在main函数中定义了一个空指针d1,但没有进行初始化,且无法通过该指针实例化对象。
下面是修改后的代码,可以正常编译和运行:
```
#include <iostream>
using namespace std;
class B {
public:
virtual ~B() {}
virtual void f() = 0;
virtual void f1(int a) { cout << a; }
virtual void f2(int a) { cout << a; }
void f3(int c) { cout << c; }
void f4(int b) { cout << b; }
};
class D : public B {
public:
void f() override { cout << "D::f()" << endl; }
void f1(int b) override { cout << b; }
void f2(int b) override { cout << b; }
void f3(int b) override { cout << b; }
void g1(char b) { cout << b; }
};
int main() {
D d1;
B* pb = &d1;
pb->f();
pb->f1(1);
pb->f2(2);
pb->f3(3);
pb->f4(4);
return 0;
}
```
修改后的代码中,对类B和D进行了一些修改:
1. 在类B中,增加了虚析构函数,避免在多态情况下出现内存泄漏的问题。
2. 在类B中的纯虚函数f()中增加了实现,在类D中使用override关键字对其进行了重写。
3. 在类D中,对虚函数f1()、f2()和f3()进行了override,并正确使用了override关键字。
4. 在类D中新增的非虚函数g1(),已经在类B中进行声明,避免了无法调用的问题。
5. 在main函数中,通过实例化对象和基类指针,对类B和D中的函数进行了测试。
分析下面的代码#include <iostream> using namespace std; class A { public: A(){cout<<"A::A() called.\n";} virtual ~A(){cout<<"A::~A() called.\n";} }; class B:public A { public: B(int i) { cout<<"B::B() called.\n"; buf=new char[i]; } virtual ~B() { delete []buf; cout<<"B::~B() called.\n"; } private: char *buf; }; void fun(A *a) { cout<<"May you succeed!" delete a; } int main() { A *a=new B(15); fun(a); return 0;
这段代码定义了两个类A和B,其中B继承自A。在main函数中,创建了一个指向B对象的A指针a,并将其传递给了fun函数。
在fun函数中,首先输出了一句话"May you succeed!",然后调用了delete操作符释放a指针所指向的内存。因为a指向的是B对象,而B类中有动态分配的char数组buf,因此在释放a指针之前,会先调用B类的析构函数~B()。在~B()中,先释放buf数组所占用的内存,然后再输出一句话"B::~B() called."。最后,由于A类有虚析构函数,因此会先调用B类的析构函数再调用A类的析构函数~A(),输出"A::~A() called."。
因此,程序的输出结果是:
B::B() called.
May you succeed!
delete []buf;
B::~B() called.
A::~A() called.
这段代码的作用是创建一个动态分配的B对象,并将其传递给函数进行操作和释放,使用了面向对象的多态性质。
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.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)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![doc](https://img-home.csdnimg.cn/images/20210720083327.png)
![doc](https://img-home.csdnimg.cn/images/20210720083327.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)