完善下列代码并输出结果include suing namespace std; class Pet{public: stirng speak()const{return "pet!"}}; calss Dog:public Pet{public:stirng speak()const{return "dog!"}}; int main(){ Dog ralph; Pet*p1=&ralph; pet&p2=ralph; Pet p3; cout<<p1->speak()<<endl; cout<<p2.speak()<<endl; cout<<p3.speak()<<endl; return 0; }
时间: 2024-04-26 08:20:26 浏览: 68
完善后的代码如下:
#include <iostream>
using namespace std;
class Pet{
public:
virtual string speak() const {
return "pet!";
}
};
class Dog : public Pet {
public:
string speak() const {
return "dog!";
}
};
int main() {
Dog ralph;
Pet* p1 = &ralph;
Pet& p2 = ralph;
Pet p3;
cout << p1->speak() << endl;
cout << p2.speak() << endl;
cout << p3.speak() << endl;
return 0;
}
输出结果为:
dog!
dog!
pet!
解释:虽然p1和p2都指向了Dog类的对象ralph,但是p1是一个指向Pet类的指针,调用speak()函数时会根据虚函数表来调用Dog类中的speak()函数,输出结果为"dog!";而p2是一个Pet类的引用,同样会根据虚函数表来调用Dog类中的speak()函数,输出结果为"dog!"。p3是一个Pet类的对象,调用speak()函数会直接调用Pet类中的speak()函数,输出结果为"pet!"。
相关问题
完善下列代码并输出结果include suing namespace std; class Pet{public:virtual stirng speak()const{return "pet!"}}; calss Dog:public Pet{public:stirng speak()const{return "dog!"}}; int main(){ Dog ralph; Pet*p1=&ralph; pet&p2=ralph; Pet p3; cout<<p1->speak()<<endl; cout<<p2.speak()<<endl; cout<<p3.speak()<<endl; return 0; }
完善后的代码如下:
#include <iostream>
using namespace std;
class Pet{
public:
virtual string speak() const {
return "pet!";
}
};
class Dog : public Pet {
public:
string speak() const {
return "dog!";
}
};
int main() {
Dog ralph;
Pet* p1 = &ralph;
Pet& p2 = ralph;
Pet p3;
cout << p1->speak() << endl;
cout << p2.speak() << endl;
cout << p3.speak() << endl;
return 0;
}
输出结果为:
dog!
dog!
pet!
解释:虽然p1和p2都指向了Dog类的对象ralph,但是p1是一个指向Pet类的指针,调用speak()函数时会根据虚函数表来调用Dog类中的speak()函数,输出结果为"dog!";而p2是一个Pet类的引用,同样会根据虚函数表来调用Dog类中的speak()函数,输出结果为"dog!"。p3是一个Pet类的对象,调用speak()函数会直接调用Pet类中的speak()函数,输出结果为"pet!"。
完善下列代码并输出结果include suing namespace std; class Testing{private:string words;int number; public:Testing(const string&s="Testing"){word=s; number=words.length(); if(words.compare("Testing")==0)cout<<1; else if(words.compare("Heap1")==0)cout<<2; else cout<<3; } ~Testing(){cout<<0;} void show()const{cout<number;} }; int main(){ Testing *pc1,*pc2; pc1=new Testing; pc2+new Testing("Heap1"); pc1->show(); delete pc1; delete pc2; return 0; }
代码中有一个错误,应该是 `pc2 = new Testing("Heap1");` 而不是 `pc2 + new Testing("Heap1");`。
修改后的完整代码并输出结果如下:
```cpp
#include <iostream>
using namespace std;
class Testing{
private:
string words;
int number;
public:
Testing(const string& s = "Testing"){
words = s;
number = words.length();
if(words.compare("Testing") == 0){
cout << 1;
}
else if(words.compare("Heap1") == 0){
cout << 2;
}
else{
cout << 3;
}
}
~Testing(){
cout << 0;
}
void show() const{
cout << number;
}
};
int main(){
Testing *pc1, *pc2;
pc1 = new Testing;
pc2 = new Testing("Heap1");
pc1->show();
delete pc1;
delete pc2;
return 0;
}
```
输出结果为:
```
1320
```
解释:
- 第一个 Testing 对象是默认构造函数创建的,words 的默认值是 "Testing",所以输出 1,然后执行 show(),输出 words 的长度 3。
- 第二个 Testing 对象是使用带参数的构造函数创建的,参数为 "Heap1",所以输出 2,然后执行 show(),输出 words 的长度 5。
- 最后依次调用两个 Testing 对象的析构函数,输出 0。
阅读全文