class Shape { public: virtual void print() { cout << "Shape"<<endl; } virtual double getArea() { return 0; } virtual double getPerimeter() { return 0; } };
时间: 2024-04-27 09:22:29 浏览: 12
这是一个C++中的基类Shape,它包含三个虚函数print()、getArea()、getPerimeter()。其中print()函数输出"Shape",getArea()函数返回0表示面积为0,getPerimeter()函数也返回0表示周长为0。这个Shape类可以被其他的派生类继承,并在派生类中重新实现这些虚函数以适应不同的形状。
相关问题
#include <iostream> using namespace std; class A { private: int nVal; public: void Fun(){ cout << "A::Fun"<<endl;} void Do(){ cout << "A::Do"<<endl;} }; class B:public A{ public: virtual void Do(){ cout << "B::Do"<<endl;} }; class C:public B { public: void Do(){ cout << "C::Do"<<endl;} void Fun() { cout << "C::Fun"<<endl;} }; void Call( ){ p->Fun(); p->Do(); } int main(){ Call(new A()); ; return 0; }
这段代码存在一些问题,无法通过编译。主要问题如下:
1. `Call` 函数中使用了指针 `p`,但没有对其进行声明或初始化,会导致编译错误。可以将其声明为基类 A 的指针,如下所示:
```cpp
void Call(A* p){
p->Fun();
p->Do();
}
```
2. `Call` 函数中调用了函数 `p->Do()`,由于 `Do` 函数被声明为虚函数,因此会根据指针所指向的对象类型来动态绑定对应的函数。但是,在本例中,由于 `Call` 函数的参数类型为 `A*`,因此无论传递的是 `A`、`B` 还是 `C` 类型的对象,都将调用基类 `A` 中的 `Do` 函数,而不是子类 `B` 或 `C` 中的函数。可以将参数类型改为 `B*` 或 `C*`,这样就能够正确地调用对应的函数,如下所示:
```cpp
void Call(B* p){
p->Fun();
p->Do();
}
```
3. 在 `main` 函数中,调用了 `Call` 函数,并传递了一个 `A` 类型的对象指针。由于 `A` 类型没有继承关系,因此无法将其转换为 `B` 或 `C` 类型的指针。可以将其改为传递一个 `B` 或 `C` 类型的对象指针,例如:
```cpp
Call(new B());
Call(new C());
```
修改后的代码如下所示:
```cpp
#include <iostream>
using namespace std;
class A {
private:
int nVal;
public:
void Fun(){ cout << "A::Fun" << endl; }
void Do(){ cout << "A::Do" << endl; }
};
class B:public A {
public:
virtual void Do(){ cout << "B::Do" << endl; }
};
class C:public B {
public:
void Do(){ cout << "C::Do" << endl; }
void Fun(){ cout << "C::Fun" << endl; }
};
void Call(B* p){
p->Fun();
p->Do();
}
int main(){
Call(new B());
Call(new C());
return 0;
}
```
输出结果为:
```
A::Fun
B::Do
A::Fun
C::Do
```
#include <iostream> #include <string> class Person { protected: std::string name; int age; std::string addr; public: void get_value() { std::cout << "请输入姓名:"; std::cin >> name; std::cout << "请输入年龄:"; std::cin >> age; std::cout << "请输入地址:"; std::cin >> addr; } }; class Teacher : public Person { public: void display() { std::cout << "姓名:" << name << std::endl; std::cout << "年龄:" << age << std::endl; std::cout << "地址:" << addr << std::endl; std::cout << "我是教师" << std::endl; } }; class Student : public Person { public: void display() { std::cout << "姓名:" << name << std::endl; std::cout << "年龄:" << age << std::endl; std::cout << "地址:" << addr << std::endl; std::cout << "我是学生" << std::endl; } }; int main() { Teacher t; Student s; s.get_value(); t = s; t.display(); return 0; }并重载operator=
在上面的代码基础上,我们可以为Teacher类重载operator=,使得可以直接将一个Student对象赋值给Teacher对象。代码如下:
```cpp
#include <iostream>
#include <string>
class Person {
protected:
std::string name;
int age;
std::string addr;
public:
void get_value() {
std::cout << "请输入姓名:";
std::cin >> name;
std::cout << "请输入年龄:";
std::cin >> age;
std::cout << "请输入地址:";
std::cin >> addr;
}
};
class Teacher : public Person {
public:
void display() {
std::cout << "姓名:" << name << std::endl;
std::cout << "年龄:" << age << std::endl;
std::cout << "地址:" << addr << std::endl;
std::cout << "我是教师" << std::endl;
}
Teacher& operator=(const Student& s) {
this->name = s.name;
this->age = s.age;
this->addr = s.addr;
return *this;
}
};
class Student : public Person {
public:
void display() {
std::cout << "姓名:" << name << std::endl;
std::cout << "年龄:" << age << std::endl;
std::cout << "地址:" << addr << std::endl;
std::cout << "我是学生" << std::endl;
}
};
int main() {
Teacher t;
Student s;
s.get_value();
t = s;
t.display();
return 0;
}
```
在Teacher类中,我们重载了operator=,使得可以将一个Student对象s赋值给Teacher对象t。在重载函数中,我们将s的数据成员name、age和addr分别赋值给t的对应成员,并返回一个指向t的引用。在主程序中,我们可以看到,我们仍然先创建了Teacher和Student对象t和s,然后调用s的get_value()函数获取数据,接着将s赋值给t,最后调用t的display()函数输出数据。