编写一个哺乳动物类Mammal,再由此派生出狗类Dog,二者都声明speak()成员函数,该函数在基类中被声明为虚函数,声明一个Dog类的对象,通过此对象调用speak函数,观察运行结果。

#include <iostream>
using namespace std;
class Mammal{
	public:
		Mammal(){
			cout<<"Mammal constructor...\n";
		}
		virtual~Mammal(){
			cout<<"Mammal destructor...\n";
		}
		virtual void speak() const{
		cout<<"Mammal speak!\n";
		}
};

class Dog:public Mammal{
	public:
		Dog(){
			cout<<"Dog Constructor...\n";
		}
		~Dog(){
			cout<<"Dog destructor...\n";
		}
		void speak()const{
		cout<<"Woof!\n";
		}
};

int main(){
	Mammal*pDog=new Dog;
	pDog->speak();
	delete pDog;
	return 0;
}

运行结果

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 好的,以下是文回复: 题目要求我们定义一个哺乳动物mammal,并由此派生出狗dog二者都要定义speak()成员函数,其基类定义为虚函数。最后,我们需要定义一个dog对象,并调用speak函数观察运行结果。 首先,我们需要定义mammal,代码如下: ``` class mammal { public: virtual void speak() { cout << "I am a mammal." << endl; } }; ``` 在这个,我们定义了一个虚函数speak(),并在其输出了一句话。 接下来,我们需要派生出狗dog,代码如下: ``` class dog : public mammal { public: void speak() { cout << "I am a dog." << endl; } }; ``` 在这 ### 回答2: 在面向对象编程一个可以继承另一个的特性并添加自己的特性,这就是继承。本题要求定义一个哺乳动物mammal,并由此派生出狗dog二者都定义speak()成员函数,其基类定义为虚函数。接下来,要定义一个dog对象,并调用speak函数观察运行结果。 首先,定义mammal: ``` class mammal { public: virtual void speak() { cout << "This is a mammal." << endl; } }; ``` 在这个,我们定义了一个虚函数speak(),因为我们不知道它将来会被什么样的子覆盖重写。mammal没有其他特殊的属性或方法,只是作为狗基类。 接着,定义dog,它是由mammal派生出来的: ``` class dog : public mammal { public: void speak() { cout << "This is a dog." << endl; } }; ``` dog继承了mammal的所有公有属性和方法,并且重写了speak()方法。我们可以看到,dogspeak()方法的输出与基类不同。 最后,定义一个dog对象调用speak函数观察运行结果: ``` int main() { dog myDog; myDog.speak(); return 0; } ``` 运行结果是: ``` This is a dog. ``` 我们可以看到,输出的结果与我们期望的一样。这是因为我们在dog重写了speak()方法,并且由于它是从mammal继承而来的,它仍然是虚函数。因此,在调用speak()时,程序会在运行时动态地查找并调用最适合的方法,也就是dogspeak()方法。这就是多态的实现。 ### 回答3: 哺乳动物和狗都属于动物的范畴,而哺乳动物则是狗的父,所以在定义出哺乳动物之后,我们可以通过继承来派生出狗类,再在狗重载基类成员函数。 首先,我们定义出哺乳动物,命名为Mammal,并在其定义一个虚函数speak()。 ```c++ class Mammal { public: virtual void speak() { std::cout << "This is a mammal speaking.\n"; } }; ``` 接下来,我们派生出狗类Dog,并在其重载基类speak()函数以实现狗叫的特效。 ```c++ class Dog : public Mammal { public: virtual void speak() { std::cout << "This is a dog speaking. Woof woof!\n"; } }; ``` 现在,我们可以调用Dog对象speak()函数观察程序的运行结果。 ```c++ int main() { Dog dog; dog.speak(); return 0; } ``` 程序的输出结果如下所示: ``` This is a dog speaking. Woof woof! ``` 由此可见,基类虚函数可以被子所重载,从而实现不同的功能。当我们调用对象重载后的函数时,程序将执行子speak()函数而不是基类函数,这就是C++的多态性的体现。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值