定义一个基类 Animal,其中包含一个纯虚函数 MakeNoise,派生类分别为 Cat 和 Dog,分别重写 MakeNoise 函数使得分别输出“喵”和 “汪汪”。
时间: 2023-02-09 11:51:42 浏览: 67
基类 Animal 定义如下:
```
class Animal
{
public:
virtual void MakeNoise() = 0;
};
```
派生类 Cat 定义如下:
```
class Cat : public Animal
{
public:
void MakeNoise() override
{
cout << "喵" << endl;
}
};
```
派生类 Dog 定义如下:
```
class Dog : public Animal
{
public:
void MakeNoise() override
{
cout << "汪汪" << endl;
}
};
```
相关问题
定义一个基类Animal,它包含两个私有数据成员,一个是name,字符串类型,存储动物的名称(例如"Fido"或"Yogi"),另一个是整数成员weight,包含该动物的重量(单位是磅)。该基类还包含一个公共的虚成员函数who()和一个纯虚函数sound(),公共的虚成员函数who()返回一个string对象,该对象包含了Animal对象的名称和重量,纯虚函数sound()在派生类中应返回一个string对象,表示该动物发出的声音(模拟输出一串字符即可)。把Animal类作为一个公共基类,派生至少三个类Sheep、Dog和Cow,在每个类中实现sound()函数。该类还包含一个公共成员函数who(),它可以显示一个信息,给出Animal对象的动物名称和重量。成员在 两个派生类中是继承得来的。
好的,这是一个典型的面向对象编程的问题。下面是C++的实现代码:
```c++
#include <iostream>
#include <string>
using namespace std;
class Animal {
private:
string name;
int weight;
public:
Animal(string n, int w) : name(n), weight(w) {}
virtual string who() {
return "I am " + name + ", and I weigh " + to_string(weight) + " pounds.";
}
virtual string sound() = 0;
};
class Sheep : public Animal {
public:
Sheep(string n, int w) : Animal(n, w) {}
string sound() {
return "baa baa";
}
};
class Dog : public Animal {
public:
Dog(string n, int w) : Animal(n, w) {}
string sound() {
return "woof woof";
}
};
class Cow : public Animal {
public:
Cow(string n, int w) : Animal(n, w) {}
string sound() {
return "moo moo";
}
};
int main() {
Animal* a1 = new Sheep("Dolly", 150);
Animal* a2 = new Dog("Fido", 50);
Animal* a3 = new Cow("Betsy", 1000);
cout << a1->who() << " " << a1->sound() << endl;
cout << a2->who() << " " << a2->sound() << endl;
cout << a3->who() << " " << a3->sound() << endl;
delete a1;
delete a2;
delete a3;
return 0;
}
```
在Animal基类中,我们定义了两个私有数据成员name和weight,以及一个公共的虚成员函数who()和一个纯虚函数sound()。who()函数返回一个string对象,该对象包含了Animal对象的名称和重量,sound()函数在派生类中应返回一个string对象,表示该动物发出的声音。
然后我们派生了三个类Sheep、Dog和Cow,每个类中实现了sound()函数。
在main()函数中,我们创建了三个Animal对象,分别是Sheep、Dog和Cow。我们调用了它们的who()和sound()函数,输出了它们的信息和声音。最后我们释放了这三个Animal对象的内存。
这就是一个基于Animal基类派生出的多态的例子。
基类与派生类指针的虚函数纯虚函数
在面向对象编程中,基类和派生类是非常常见的概念。基类是一种通用类,派生类则是从基类继承而来的特定类。基类中定义的函数可以在派生类中重写,以实现不同的行为。为了实现这种多态性,我们通常使用虚函数或者纯虚函数。
虚函数是在基类中声明的,具有一个默认的实现,但是可以在派生类中重写。使用虚函数可以实现运行时多态性,也就是说,在程序运行的时候才能确定调用哪个函数。
纯虚函数是一种特殊的虚函数,没有默认的实现,必须在派生类中实现。纯虚函数只需要声明,不需要实现。使用纯虚函数可以实现接口和抽象类,强制派生类必须实现这些函数。
在使用基类和派生类指针时,如果想要调用派生类中的虚函数或者纯虚函数,需要将基类的指针或引用转换为派生类的指针或引用,然后再调用函数。如果不进行类型转换,则会调用基类中定义的函数。
阅读全文