#include<iostream> using namespace std; class B { public: B(int i){b=i+50;show();} B(){} virtual void show() { cout<<"B::show()called."<<b<<endl; } protected: int b; }; class D:public B { public: D(int i):B(i){d=i+100;show();} D(){} void show() { cout<<"D::show()called."<<d<<endl; } protected: int d; }; int main() { D d1(108); }分析该程序原因及结果
时间: 2024-02-26 19:54:59 浏览: 69
该程序是一个简单的面向对象程序,其中定义了两个类B和D,B是D的基类,B中有一个int类型的成员变量b和一个虚函数show(),D中有一个int类型的成员变量d和一个覆盖了B的虚函数show()。在main函数中,创建了一个D类型的对象d1,并且将108作为参数传递给了D的构造函数。
程序的执行过程如下:
1. 创建D类型的对象d1,并将108作为参数传递给D的构造函数。
2. D的构造函数调用了B的构造函数,将参数i+50赋值给了B的成员变量b。
3. B的构造函数调用了B的虚函数show(),由于D覆盖了B的虚函数show(),因此调用的是D的show()函数,输出"D::show()called.158",其中158是d1的成员变量d的值。
4. D的构造函数将参数i+100赋值给了D的成员变量d。
5. D的构造函数再次调用了D的虚函数show(),输出"D::show()called.208",其中208是d1的成员变量d的值。
6. 程序结束,d1对象被销毁。
因此,程序的输出结果为:
D::show()called.158
D::show()called.208
相关问题
#include <iostream> #include <string> using namespace std; class B { int b; public: B(int i){ b = i; } }; class C { B b; public: C(int i){ b = B(i); } friend void show(); }; void show() { C c(10); cout<<"value of b is: "<<c.b.b<<endl; } int main(){ show(); return 0; }
这段代码会出现错误,因为在类C的构造函数中,使用了成员初始化列表的方式对成员变量b进行了初始化,但是B类的构造函数需要一个int类型的参数,而在使用B(i)进行初始化时,会将i作为参数传递给B类的构造函数。但是由于B类没有定义默认构造函数,因此编译器无法找到合适的构造函数进行初始化,从而导致编译错误。
正确的做法是在类B中定义一个默认构造函数,如下所示:
```
#include <iostream>
#include <string>
using namespace std;
class B {
private:
int b;
public:
B() { b = 0; } // 定义默认构造函数
B(int i) { b = i; }
};
class C {
private:
B b;
public:
C(int i) : b(B(i)) {} // 使用成员初始化列表进行初始化
friend void show();
};
void show() {
C c(10);
cout << "value of b is: " << c.b.b << endl;
}
int main() {
show();
return 0;
}
```
在上述代码中,定义了一个默认构造函数B()来解决编译错误。同时,在类C的构造函数中,使用成员初始化列表的方式对成员变量b进行了初始化,将参数i传递给B类的构造函数进行初始化。最后,调用show函数输出成员变量b的值。
#include<iostream> using namespace std; #include<iostream> using namespace std; //在此处添加代码 class Line: public Shape{ public: void Show(){cout<<"Line"<<endl;} }; class Rect: public Shape{ public: void show(){cout<<"Rect"<<endl;} }; int main(){ Shape *p = new Line(); p->Show(); delete p; Shape *p = new Rect(); p->Show(); delete p; return 0; } 输出结果: Line Rect
这段代码存在问题,因为在 main 函数中定义了两个名为 p 的指针变量,这样会导致编译错误。
另外,类 Rect 中的 show 函数名应该改为 Show,以保持与基类 Shape 中的虚函数名一致。修改后的代码如下:
```
#include<iostream>
using namespace std;
class Shape{
public:
virtual void Show() = 0;
};
class Line: public Shape{
public:
void Show(){ cout << "Line" << endl; }
};
class Rect: public Shape{
public:
void Show(){ cout << "Rect" << endl; }
};
int main(){
Shape *p = new Line();
p->Show();
delete p;
p = new Rect();
p->Show();
delete p;
return 0;
}
```
输出结果为:
```
Line
Rect
```
其中,Shape 类中的 Show 函数是纯虚函数,因此 Line 和 Rect 类都需要实现该函数并重写基类中的该函数。在 main 函数中,先创建一个指向 Line 类对象的 Shape 指针 p,调用 p 的 Show 函数输出 "Line",然后释放内存;再创建一个指向 Rect 类对象的 Shape 指针 p,调用 p 的 Show 函数输出 "Rect",最后再释放内存。
阅读全文