#include<iostream> using namespace std; class A{ public: A(){ cout<<"A()"<<endl; } virtual void f(){cout<<"A::f()"<<endl;} void g(){cout<<"A::g()"<<endl;} ~A(){cout<<"~A()"<<endl;} }; class B:public A{ public: B(){cout<<"B()"<<endl;} void f(){cout<<"B::f()"<<endl;} void g(){cout<<"B::g()"<<endl;} ~B(){cout<<"~B()"<<endl;} }; int main(){ A a, *p; p = new B; a.f(); a.g(); p->f(); p->g(); }会输出什么
时间: 2023-10-30 07:15:14 浏览: 74
这段代码的输出结果是:
```
A()
A()
B()
A::f()
A::g()
B::f()
A::g()
~B()
~A()
~A()
```
首先会输出两个"A()",因为在main函数中定义了一个"A a"和一个"A* p",所以会调用两次A类的构造函数。
然后会输出一个"B()",因为在main函数中通过new关键字动态分配了一个B类的对象,并将其地址赋给了指向A类的指针p。
接下来会依次调用a.f()和a.g(),因为a是A类的对象,所以会调用A类的f()和g()函数,输出"A::f()"和"A::g()"。
然后会依次调用p->f()和p->g(),因为p指向B类的对象,所以会调用B类的f()和g()函数,分别输出"B::f()"和"B::g()"。
最后会依次调用B类的析构函数和A类的析构函数,以及a对象的析构函数,输出"~B()"、"~A()"和"~A()"。
相关问题
#include<iostream> using namespace std; class vehicle { private: int MaxSpeed; int Weight; public: virtual void Run() { cout<<"Run"<<endl; } virtual void Stop() { cout<<"Stop"<<endl; } }; class bicyle:public vehicle { private: int Height; }; class motorcar:public vehicle { private: int SeatNum; }; class motocycle:public bicyle,public motorcar { }; int main(){ motocycle a; a.Run(); a.Stop(); return 0; }有什么问题怎么改
在这段代码中,motocycle类同时继承了bicyle和motorcar类,这样会导致多重继承问题。因为在调用a.Run()和a.Stop()方法时,编译器无法确定应该调用哪个父类的方法。为了解决这个问题,可以使用虚拟继承。
修改代码如下:
```
#include<iostream>
using namespace std;
class vehicle {
private:
int MaxSpeed;
int Weight;
public:
virtual void Run()
{
cout<<"Run"<<endl;
}
virtual void Stop()
{
cout<<"Stop"<<endl;
}
};
class bicyle: virtual public vehicle {
private:
int Height;
};
class motorcar: virtual public vehicle {
private:
int SeatNum;
};
class motocycle:public bicyle,public motorcar {
};
int main(){
motocycle a;
a.Run();
a.Stop();
return 0;
}
```
在bicyle和motorcar类的继承声明中加上virtual关键字,将它们变为虚拟继承,这样motocycle类中就只有一份vehicle类的实例,避免了多重继承问题,同时也保留了bicyle和motorcar类的特性。
#include <iostream> using namespace std; class BaceClass { public: BaceClass(); }; BaceClass::BaceClass() { cout << "构造基类对象" << endl; }; class DerivedClass : public BaseClass { public: DerivedClass(); }; DerivedClass::DerivedClass() { cout << "构造派生类对象" << endl; } int main(int argc, char** argv) { DerivedClass d; return 0; }哪里错了
代码中有一个类名拼写错误,将 `BaceClass` 改为 `BaseClass` 即可,另外需要将基类的构造函数改为 `virtual`,否则派生类的构造函数不会调用基类的构造函数。
正确的代码如下:
```
#include <iostream>
using namespace std;
class BaseClass {
public:
virtual BaseClass();
};
BaseClass::BaseClass() {
cout << "构造基类对象" << endl;
};
class DerivedClass : public BaseClass {
public:
DerivedClass();
};
DerivedClass::DerivedClass() {
cout << "构造派生类对象" << endl;
}
int main(int argc, char** argv) {
DerivedClass d;
return 0;
}
```
阅读全文