#include <iostream> using namespace std; class A{ public: A(){ t(); } void t(){ setI(20); } virtual void setI(int i){ this->i = 2 * i; } int i; }; class B: public A{ public: B(){ cout << "i from B is " << i << endl; } virtual void setI(int i){ this->i = 3 * i; } }; int main(){ A* p = new B(); return 0; }为什么i=40
时间: 2024-04-28 10:25:35 浏览: 39
在这段代码中,类A和类B都有一个成员变量i。在主函数中,我们创建了一个指向A类的指针p,并将其指向一个新的B类对象。在执行这个语句时,会先调用A类的构造函数,然后调用A类的t()方法。在t()方法中,调用了A类的setI()方法,并将i的值设置为20的两倍,即40。然后,由于setI()方法是虚拟的,因此会调用B类的setI()方法,将i的值设置为20的三倍,即60。但是,由于这个指针是指向A类的,因此只会使用A类的成员变量i,因此最终i的值为40。
相关问题
指出下面程序中的错误,说明错误的原因,并进行改正 #include <iostream>using namespace std;class Student {public: char name[10]; int age; float aver; void printStu();};int main() { Student p1,p2,p3; p1.age = 30; return 0;}
该程序存在两个错误,包括:
1. `#include <iostream>using namespace std;` 应改为 `#include <iostream> using namespace std;`
2. `Student p1,p2,p3;` 中的逗号应该为英文逗号,否则编译器将无法正确识别变量声明。应改为 `Student p1, p2, p3;`
改正后的代码如下:
```
#include <iostream>
using namespace std;
class Student {
public:
char name[10];
int age;
float aver;
void printStu();
};
int main() {
Student p1, p2, p3;
p1.age = 30;
return 0;
}
```
阅读全文